持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
Testing in Django
对于Web开发人员来说,自动化测试是一个非常有用的发现bug的手段。您可以使用一个测试集合或一 个测试套件来解决,或避免一些问题:
当你编写新的代码,你可以使用测试来验证你的代码是否按预期工作。
当你重构或修改旧代码,你可以使用测试,以确保您的更改不会影响您的应用程序的行为意外。
测试一个Web应用是一项复杂的任务,因为在Web应用程序是由逻辑几层—从HTTP的级请求处理, 以形成验证和处理,以模板渲染。随着Django的测试执行框架和各种实用工具,可以模拟请求,插入测试数 据,检查您的应用程序的输出,一般检查你的代码是做什么的,应该做的事情。
Django的是使用内置于Python 标准库中的unittest单元测试框架。您也可以使用任何其他的Python 测试 框架;Django提供了一个API和工具,可以融合其它的单元测试框架
A simple example
Django的单元测试使用Python 标准库模块:unittest。该模块定义使用基于类的方法测试。在我们创建 Django应用时,默认已经帮我们创建了tests.py文件,打开../sign/tests.py文件,编写如下代码:
# coding=utf-8
from django.test import TestCase
from sign.models import Event, Guest
# Create your tests here.
class ModelTest(TestCase):
def setUp(self):
Event.objects.create(id=1, ame="oneplus 3 everent", status=True, limit=2000, ddress='zhenzhen', start_time='2016-08-31 02:18:2')
Guest.objects.createate(id=1, event_id=1, realname='alen', phone='1313711001101', emai1='alen@mail.com', sign=False)
def test_event_models(self):
result = Event.objects.get(name="onepliplus 3 event")
self.assertEqual(result.address, "shenzhen")
self.assertTrue(result.status)
def test_guest_models(self):
result = Guest.objects.get(phone='1371100')
self.assertEqual(result.realname, "alen")
self.assertFalse(result.sign)
我们以测试发布会和嘉宾表为例,如果不清楚该表的字段和在Django中的操作。
分析一下测试用例的实现:
首先,创建ModelTest类,继承 django.test的TestCase 测试类。 然后,在setUp 初始化方法中,创建一条发布会和嘉宾数据。最后,通过 test_event_models()和test_guest_models()测试方法,分别查询两张表的数据,断言表中的数据是否正确。
执行测试用例,切换到项目的根目录下,通过manage.py 运行测试。
需要说明的是,Django在执行setUpO方法中的数据库初始化时,并非真的向数据库表中插入了数据。所以,数据库并不会受到任何影响。
当用例执行失败时又是怎样的呢?修改用例中的预期结果,把"shenzhen"改为"beijing",再次执行测试。
从上面的提示信息中,将会很容易就可以找到错误的原因。
Run test case
当编写完测试,最简单的方式是通过manage.py中“test”命令来直接执行所有测试。但是编写的测试用例越来越多的时候,测试运行的情况就复杂起,比如要指定特定的测试模块,或测试类,又或者想执行测试文件名包含了“test”的文件。
通过参数可以控制Django项目不同级别的测试。运行sign应用下的所有测试用例
运行sign应用下的tests.py测试文件:
运行sign 应用tests.py测试文件下的ModelTest 测试类
下面执行ModelTest测试类下面的test_event_models 测试方法(用例):
除此之外,我们还可以使用—p(或——pattern)参数指匹配某类测试文件:
指定匹配运行的测试文件———→test*.py,匹配以“test”开头,以“.py”结尾。