本文共 2032 字,大约阅读时间需要 6 分钟。
一、什么是单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。如果测试通过则说明我们这个函数或功能能够正常工作,如果失败要么测试用例不正确,要么函数有bug需要修复。
二、如何使用单元测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | from django.test import TestCase from app01.models import * class AuthorTestCase(TestCase): # 测试开始前的工作 def setUp( self ): auths = Author.objects. all ().values() print (auths) # 测试结束的收尾工作 def tearDown( self ): Author.objects. filter (name = "Steven" ).delete() auths = Author.objects. all ().values() print (auths) # 自己定义的测试方法,必须以"test_"开头 def test_insert_data( self ): Author.objects.create(name = "Steven" , hobby = "骑行" ) auths = Author.objects. all ().values() print (auths) 输出: <QuerySet []> <QuerySet [{ 'name' : 'Steven' , 'id' : 1 , 'hobby' : '骑行' }]> <QuerySet []> |
Django的单元测试实际是基于Python的unittest模块,“setUp”方法是测试开始前的工作,“tearDown”方法是测试结束的收尾动作,这些方法名都是固定的,不允许随意修改,里面内容你也可以不写直接“pass”。“test_insert_data”是我自己定义的测试内容,方法名必须以“test_”开头,可以任意写多个自定义测试方法。
Django单元测试注意点:
1. 对于每一个测试方法都会讲setUp()和tearDown()方法执行一遍
2. Django会在数据库中自动新建一个测试数据库来进行数据库方面的测试,默认在测试完成后销毁。所以不用担心它会影响你实际的生成数据库!
三、运行单元测试
1. 测试项目中所有的应用
1 | python3 manage.py test |
2. 测试项目中单独的应用
1 | python3 manage.py test app01 |
3. 运行项目中某个应用的测试文件中的一个Case
1 | python3 manage.py test app01.test2.AuthorTestCase |
4. 运行项目中某个应用的测试文件中的一个Case中的其中一个测试方法
1 | python3 manage.py test app01.test2.AuthorTestCase.test_insert_data |
5. 运行单元测试结束时不自动删除测试数据库(保留测试数据库)
1 | python3 manage.py test app01 - - keepdb |
# 为什么要有这个呢?如果你有很多测试用例,定义了许多测试方法,那么每次在做数据库操作时都会创建数据库、删除数据库,严重影响执行效率。这样我们就保留测试数据库,记得下次执行测试时也要带上--keepdb,不然会提示你删除上一次的测试数据库
四、指定测试数据库的字符集
这是我之前踩过的一个坑,之前用Pycharm写过的一个项目执行测试没有任何问题,过几天重新打开执行单元测试,结果报了字符集错误,然后测试数据库没有自动删除。我经过仔细排查,发现自动创建的测试数据库字符集竟然是“latin1”,我数据库表中有中文,所以直接报错了。知道错误原因就好办了,我查询了官方文档,在setting.py文件中强制设置测试数据库字符集是“UTF8”。
1 2 3 4 5 6 7 8 9 10 11 | DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'xxx' , 'USER' : 'xxx' , 'PASSWORD' : 'xxx' , 'HOST' : '', 'PORT' : '', 'TEST' : { 'CHARSET' : 'utf8' , }, } } |