目录

    Django中写自动化测试可以使用:doctests或unit tests。自动化测试的逻辑是,将测试数据传入待测试函数,执行后,以输出结果与预期是否一致,作为判断测试是否通过的标准。这里有几个关键点,(1)需要测试数据,(2)需要指明待测试函数,(3)需要给出预期的结果。

    1. 测试驱动开发

    tdd.png

    测试驱动开发是一个迭代的开发周期,先编写自动化测试代码,再填充功能。

    • 第一步,先编写测试
    • 第二步,查看测试失败的地方
    • 第三步,编写足够的代码以使测试通过
    • 第四步,再次测试
    • 第五步,代码重构
    • 第六步,重复以上操作

    2. doctests

    doctests是Python内置的测试模块。

    由普通部分和执行部分组成。

    • 普通部分为注释部分
    • 执行部分由’>>>’(python shell提示符)或’…’提示符区分。

    doctest搜索各个模块、类和函数中的docstring,把每个可执行部分当做一次测试范例运行。再将实际运行值和期望值,对比作为一次运行结果。

    myfunction.py

    # -*- coding: utf-8 -*-
    import doctest
    
    def add(x, y):
        """
        >>> add(1, 2)
        3
        """
        return x + y
    
    python -m doctest -v myfunction.py 
    
    Trying:
        add(1, 2)
    Expecting:
        3
    ok
    1 items had no tests:
        mytest
    1 items passed all tests:
       1 tests in myfunction.add
    1 tests in 2 items.
    1 passed and 0 failed.
    Test passed.
    

    v参数表示开启啰嗦模式,可以查看详情,如果不使用v参数,测试成功后不会有任何提示。如果测试不通过,则打印错误报告。

    3. unit tests

    Django的单元测试是基于类实现的,

    运行测试时,test runner会在目录的test*.py文件中寻找单元测试用例类(继承自TestCase),在测试类中执行test开头的函数。

    Django内置了一些测试辅助类,比如Test Client、TestCase、Email Service。通过Client,可以方便的发起一个get或者post请求,并取得返回结果。TestCase是对unittest.TestCase进行了封装,省去了很多重复要写的代码,新增了一个self.client。Email Service提供了方便的邮件发送的方法。

    3.1 怎样写单元测试

    Model部分的测试

    from django.test import TestCase
    from .models import Fruit
    
    class FruitTestCase(TestCase):
        # 初始化代码
        def setUp(self):
            Fruit.objects.create(name="apple", price=10)
    
        def test_fruit(self):
            fruit= Fruit.objects.get(name='apple')
            self.assertEqual(fruit.price, 10)
    

    View部分的测试

    from django.test import TestCase
    
    class ViewTest(TestCase):
        def test_get(self):
            response = self.client.get('/fruit/1/')
            self.assertEqual(response.status_code, 200)
    

    3.2 运行单元测试

    # 搜索当前目录及子目录中test*.py文件,全部测试用例执行
    python manage.py  test
    # 运行某个测试类的全部用例
    manage.py test myapp.FruitTestCase 
    # 运行某个测试类中某一个用例
    manage.py test myapp.FruitTestCase.test_fruit
    
    

    Django会自动在Model中创建测试数据,测试完后清除。如果想要保留测试数据,请执行单元测试时,带上–keepdb参数。

    4. 参考