Please enable Javascript to view the contents

Django自动化测试

 ·  ☕ 3 分钟

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

1. 测试驱动开发

tdd.png

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

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

2. doctests

doctests是Python内置的测试模块。

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

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

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

myfunction.py

1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*-
import doctest
  
def add(x, y):
    """
    >>> add(1, 2)
    3
    """
    return x + y
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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部分的测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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部分的测试

1
2
3
4
5
6
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 运行单元测试

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

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

4. 参考


微信公众号
作者
微信公众号