title: Django单元测试总结
date: 2019/6/18 17:50:00
body: [article]
description: " 在本文中,笔者大体对Django单元测试的基本操做进行了介绍。在阅读完本文后,读者可以运用Django框架提供的单元测试的API对本身的程序编写单元测试文件。"
category:python
在本文中,笔者大体对Django单元测试的基本操做进行了介绍。在阅读完本文后,读者可以运用Django框架提供的单元测试的API对本身的程序编写单元测试文件。
此外,笔者开发的环境以下所示。数据库
PyCharm 2019.1.1 (Professional Edition)
Build #PY-191.6605.12, built on April 3, 2019
JRE: 11.0.2+9-b159.34 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0django
Django框架为单元测试基于Python的unittest包封装了test模块。经过继承Django框架提供的测试模板,可以为须要测试的方法或者类构造测试类。对于每个须要测试的的单元(类或方法)各自构造一个测试类,在每一个类中按照被测试单元的功能要求、错误处理要求等分别构造测试样例以及相应的辅助方法。
以下段代码所示,对于最基本的一个测试单元,须要有一个继承模板、测试准备方法以及若干测试方法。json
# 引入Django.test提供的测试模块,这里选用的是TestCase类做为单元测试的模板。 from django.test import TestCase # 引入测试须要的类或方法。 from Function.models import function # 构造单元测试类,继承相应的模板。 class TestUnit(TestCase): def setUp(self): # 测试前的准备工做:建立对象、数据库环境等。 # 功能正确性测试 def test_function_successful(self): # 使用被测试提供的类进行必定操做 # 。。。。。。 # 验证操做后产生的结果 # 。。。。。。 # 错误处理测试 def test_function_dail(self): # 使用被测试的API进行必定操做,产生预期中的错误。 # 。。。。。。 # 检查错误处理的正确性 # 。。。。。。
Django框架为使用者提供了四种的测试模板,分别为TestCase、LiveServerTestCase、TransactionTestCase、SimpleTestCase。其中SimpleTestCase是Django框架中最基本的模板类是在unittest.TestCase类基础上增长了部分功能构造的子类。在没有数据库操做时可以使用该类做为测试模板。TransactionCase和TestCase在此基础之上支持复杂的数据库操做。通常状况下使用TestCase做为测试模板类。
在模板类中,除用于测试的样例方法以外,使用者还能够重构框架提供的了几种特殊的方法,用于作一些数据准备和销毁的操做。后端
Function Name | Info |
---|---|
setUpClass | 在每一个测试类创建时会被调用 |
tearDownClass | 在运行完测试类中每一个样例后被调用 |
setUp | 在执行每一个测试样例前被调用 |
tearDown | 在执行完每一个测试样例后被调用 |
setUpTestData | TestCase类的方法,相似于setUpClass,执行更快速 |
在Django.test模块中定义了Client类用于在测试工程中模拟多种请求的发送。经过使用Client的对象中的不一样方法并对相应的参数进行设置便可以使用单元测试的请求发送功能。而且须要调用的方法与须要发送的请求有相同的名称,好比发送Get请求时须要调用Client.get方法。api
# 引入客户端模拟类 from Django.test import Client # 建立客户端模拟对象 c = Client() # 客户端发送请求 c.get('url')
Django的单元测试模板类继承了CLient类。可以在构造单元测试类中直接调用Client类的相应方法。app
from Django.test import TestCase class TestUnit(TestCase): def test(self): # 调用自身的方法 self.get('url') pass
Django测试模块支持如下类型的请求。框架
请求类型 | 调用方法 |
---|---|
Post请求 | post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra) |
Get请求 | get(path, data=None, follow=False, secure=False, **extra) |
Head请求 | head(path, data=None, follow=False, secure=False, **extra) |
Option请求 | options(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Put请求 | put(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Patch请求 | patch(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Delete请求 | delete(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Trace请求 | trace(path, follow=False, secure=False, **extra) |
参数名 | 含义解释 |
---|---|
path | 发送请求使用url |
data | 发送请求时携带的数据 |
content_type | 携带数据的格式 |
经过Client对象发出的请求在通过被测试单元的一系列操做以后,返回的数据会以返回值的形式返回。通常状况下,后端返回的数据形式为json格式,在接收数据后须要调用json
方法进行解析。函数
c = Client() response = c.get('/res/') renponse = response.json() # 此时response为字典格式的数据
同其余单元测试相似,Django框架提供了几种断言函数,用于对运行结果进行验证,而且每一个模板类都包含了这些函数。post
class TestUnit(TestCase): def test(self): self.assertEqual(a, b) # 检验a是否等于b self.assertTrue(a) self.assertFalse(b) # ......
更多的断言函数见官方模板的相应部分
在Terminal中输入如下指令便可运行单元测试文件。其中Module_name
为须要运行的模块的名称。
py manage.py test Module_name
笔者开发使用的IDE是PyCharm,其中自带覆盖率统计插件。以run with coverage
的方式运行单元测试可以自动地获取到被测试单元的覆盖率。