Django中写自动化测试可以使用:doctests或unit tests。自动化测试的逻辑是,将测试数据传入待测试函数,执行后,以输出结果与预期是否一致,作为判断测试是否通过的标准。这里有几个关键点,(1)需要测试数据,(2)需要指明待测试函数,(3)需要给出预期的结果。
1. 测试驱动开发
测试驱动开发是一个迭代的开发周期,先编写自动化测试代码,再填充功能。
- 第一步,先编写测试
- 第二步,查看测试失败的地方
- 第三步,编写足够的代码以使测试通过
- 第四步,再次测试
- 第五步,代码重构
- 第六步,重复以上操作
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. 参考