Django偏爱使用Python标准库中内置的unittest模块来编写测试,当然在Django中进行web测试也可以使用另一个python测试框架,Django提供了用于这种集成的API和工具。
使用python标准模块unittest的单元测试
Django中创建应用(mylists)的测试写在应用目录(mylists/)下的tests.py文件中。测试系统会自动在所有以tests开头的文件里寻找并执行测试代码。
Django中创建的测试类都继承自django.test.TestCase,这个类又继承自unittest.TestCase,编写好测试类及对应的以tests开头的测试用例后,可以使用以下命令执行:
python manage.py test mylists
执行命令,测试主要经过了以下一些过程:
1)命令将会寻找mylists应用里(mylists目录下)的测试代码;
2)找到django.test.TestCase的子类;
3)创建一个特殊的数据库供测试使用;
4)在类中寻找测试方法–以tests开头的方法
5)执行方法中的内容(创建变量、实例、断言等)
注意⚠️:如果测试用例依赖数据库连接,比如创建或查询模型,那么编写的测试类需继承自django.test.TestCase,而不是直接继承unittest.TestCase,而如果不依赖数据库,直接继承unittest.TestCase就好,因为使用unittest.TestCase可以避免在交互中运行每个测试用例及刷新数据库的成本。
当然,测试时创建的数据库不是开发时实际的数据库,而是专门为测试创建的空白数据库,当所有的测试都执行完成后,测试的数据库就会销毁。
可以使用命令:
python manage.py test --keepdb
保留测试数据库。
如果在测试用例执行过程中,使用了Ctrl+C中断了测试的执行,用于测试的数据库没有被自动销毁,当运行下一次测试时,会被询问是否reuse or destory the database。使用命令:
python manage.py test --noinput
会强制禁止显示该提示并且会自动销毁之前的测试数据库。
Django测试工具
测试工具之Client
Django提供了一个供测试使用的Client来模拟用户和视图层代码的交互。
Client测试视图函数以及可以和基于django的应用编程交互。
Client测试工具可以完成下列事情:
1)模拟Get和Post请求,观察响应结果–从HTTP到页面内容;
2)查看重定向链以及在每一步确认URL和状态码;
3)用一个包括特定值的模板内容来测试一个被Django模板渲染的请求。
注意⚠️:django的client测试工具不是替代selenium或其他网页测试工具,client有自己的关注点,简要的说有以下两点:
1)使用django的client建立正确的模板,并且向模板传递正确的内容;
2)使用selenium这类web自动化测试框架来测试渲染的HTML以及网页行为,django也提供了对这些框架的支持,如LiveServerTestCase。
使用Client的一个简单例子:
from django.test import Client
c = Client()
response = c.post('/login/', {
'username' : 'banana', 'password' : '123456'})
response.status_code
response = c.get('/user/details/')
response.content
注意⚠️:
测试工具Client不要求网页服务器在运行着,这是因为client避免了HTTP的开销直接处理Django框架,这对快速运行单元测试是有帮助的;
另外,当需要检索页面时,只需要给定URL的路径,不需要整个域名,比如:
c.get('/login/')
正确,但以下这种方法就是错误的
c.get('https://www.mysite.com/login/')
当然,client测试工具不能检索哪些不是由django项目启动的web页面,如果需要检索这些页面,可以使用python标准库urllib或urllib2。
为解析URL,client会使用由你ROOT_URLCONF配置中的URLconf。
默认情况下,client将禁用任何由你的站点执行的CSRF检查,若想要client测试执行CSRF检查,可以在创建client时添加参数:
csrf_client = Client(enforce_csrf_checks = True)
发出请求
Client类原型是
class Client(enforce_csrf_checks=False, json_encoder=DjangoJSONEncoder, **defaults)源代码
一般情况下,创建client实例只需使用默认参数即可。
c = Client()
可调用的方法