Django单元测试简介
- Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类名为django.test.TestCase,继承于python的unittest.TestCase。
- 对于每一个测试方法都会将setUp()和tearDown()方法执行一遍。
- 会单独新建一个测试数据库来进行数据库的操作方面的测试,默认在测试完成后销毁。
- 在测试方法中对数据库进行增删操作,最后都会被清除。也就是说,在test_add中插入的数据,在test_add测试结束后插入的数据会被清除。
- django单元测试时为了模拟生产环境,会修改settings中的变量,例如, 把DEBUG变量修改为True, 把ALLOWED_HOSTS修改为[*]。
运行单元测试
- 在目录下运行如下指令,即可运行单元测试。
python manage.py test
- 运行测试的时候,测试程序会在所有以test开头的文件中查找所有的test cases(inittest.TestCase的子类),自动建立测试集然后运行测试。
- 在单元测试中,可以指定测试粒度。这样可以专注于只测试还没测试的单元测试,而已经测试过的就不测试了。
范例
#学号绑定
class bindTest(TestCase):
#初始化
def setUp(self):
User.objects.create(open_id='id1', student_id='2016012072')
User.objects.create(open_id='id2',student_id='')
User.objects.create(open_id='id3',student_id='')
#获取当前用户的学号绑定状态
def test_usertest_get(self):
c = Client()
response = c.get('/api/u/user/bind/?',{"openid":"id1"})
self.assertEqual(response.json()['data'],"2016012072")
#未绑定用户的测试
def test_usertest_get_none(self):
c = Client()
response = c.get('/api/u/user/bind/?',{"openid":"id2"})
self.assertEqual(response.json()['data'],"")
#将当前用户绑定至指定学号
def test_usertest_post(self):
User_bind = UserBind()
User_bind.input = {
'openid':'id2',
'student_id':'2016010000',
'password':'123456test'
}
User_bind.post()
self.assertEqual(User.get_by_openid('id2').student_id, '2016010000')
#对已绑定的用户进行重复绑定
def test_usertest_post_wrong_studentid(self):
User_bind = UserBind()
User_bind.input = {
'openid':'id2',
'student_id':'2016010002',
'password':'123456test'
}
User_bind.post()
self.assertEqual(User.get_by_openid('id2').student_id, '2016010002')
注意事项:
单元测试中,用来初始化的函数必须命名为setUp(),用来测试的函数必须命名为test_xxx()的格式。
单元测试的等级
- 正常流程可用,即一个函数在输入正确的参数时,会有正确的输出
- 异常流程可抛出逻辑异常,即输入参数有误时,不能抛出系统异常,而是用自己定义的逻辑异常通知上层调用代码其错误之处
- 极端情况和边界数据可用,对输入参数的边界情况也要单独测试,确保输出是正确有效的
- 所有分支、循环的逻辑走通,不能有任何流程是测试不到的
- 输出数据的所有字段验证,对有复杂数据结构的输出,确保每个字段都是正确的地方