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文件,并运行测试用例。

  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/peng104/p/11364927.html
Copyright © 2011-2022 走看看