zoukankan      html  css  js  c++  java
  • Python项目中的单元测试

    引入

    单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架。 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元测试框架的基本使用。

    一个简单的测试例子

    定义一个类,简单的实现addsub两个方法,并对其进行单元测试。

    待测试的m1.py文件内容如下:

    class MyClass(object):
        """just a test case"""
        def __init__(self, x, y):
            self.x = int(x)
            self.y = int(y)
    
        def add(self):
            return self.x + self.y
    
        def sub(self):
            return self.x - self.y

    在与m1.py同级的目录下创建test.py测试文件,使用unittest单元测试框架对A类的方法进行测试。代码内容如下:

    import unittest
    from m1 import MyClass
    
    
    class MyClassTest(unittest.TestCase):
        def setUp(self):
            self.calc = MyClass(7, 5)
    
        def tearDown(self):
            pass
    
        def test_add(self):
            ret = self.calc.add()
            self.assertEqual(ret, 12)
    
        def test_sub(self):
            ret = self.calc.sub()
            self.assertEqual(ret, 2)
    
    
    if __name__ == '__main__':
        # 构造测试集
        suite = unittest.TestSuite()
        suite.addTest(MyClassTest('test_add'))
        suite.addTest(MyClassTest('test_sub'))
        # 执行测试
        runner = unittest.TextTestRunner()
        runner.run(suite)

    运行测试:

    demo1 $ python3 test.py 
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK

    到此一个简单的单元测试就完成了。

    unittest框架知识点

    unittest框架中4个重要的概念:

    1. test fixture:是初始化和清理测试数据及环境,通过重写TestCase的setUp()tearDown()方法来实现
    2. test case:是测试用例
    3. test suite:是测试用例的集合(俗称测试套件),通过addTest加载TestCase到TestSuite中,返回一个TestSuite实例。
    4. test runner:的作用是运行测试用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suitetest case

    Django中的单元测试

    Django项目的app目录下都默认生成了一个

    Model部分单元测试用例

    假设项目中有一个Book的model:

    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=10, decimal_places=2)

    测试用例代码:

    # app01/tests.py
    from django.test import TestCase
    from app01.models import Book
    # Create your tests here.
    
    
    class BookModelTest(TestCase):
        def setUp(self):
            Book.objects.create(title='书名', price=11.11)
    
        def test_book_model(self):
            from decimal import Decimal
            result = Book.objects.get(title='书名')
            self.assertEqual(result.price, Decimal('11.11'))

    运行测试,在项目目录下运行:

    $ python3 manage.py test
    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.003s
    
    OK
    Destroying test database for alias 'default'...

    测试用例OK…

    视图部分单元测试用例

    假设我们有个index视图,代码如下:

    def index(request):
        return render(request, 'index.html')

    app01/tests.py文件中添加测试用例代码:

    # app01/tests.py
    class IndexPageTest(TestCase):
        """测试index页面"""
        def test_index_page_renders_index_template(self):
            """测试index视图"""
            response = self.client.get('/index/')
            self.assertEqual(response.status_code, 200)  # 判断状态码
            self.assertTemplateUsed(response, 'index.html')  # 判断渲染的模板是否正确

    在项目根目录运行python manage.py test命令:

    $ python3 manage.py test
    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.027s
    
    OK
    Destroying test database for alias 'default'...

    python manage.py test命令会查找当前项目中的tests.py文件,并运行测试用例。

  • 相关阅读:
    layer备忘
    Java中遍历Map对象的4种方法
    为什么Java中1000==1000为false而100==100为true?
    linux系统安装psycopg2
    centos7源码安装mysql5.7
    Azure Sql
    javascript和jQuery动态修改css样式的方法
    Git early EOF index-pack failed 问题
    C# 多线程——SemaphoreSlim的使用
    Docker 可视化
  • 原文地址:https://www.cnblogs.com/peng104/p/11364927.html
Copyright © 2011-2022 走看看