django test plus为django的默认测试用例提供了有用的补充
django-test-plus的Python项目详细描述
Django测试加分
对django的默认测试用例的有用补充
基本原理
让我们面对现实吧,写测试并不总是有趣的。部分原因是 这就是你最后写的所有样板。Django Test Plus是 在编写django测试时试图减少其中一些。我们 保证在你到达腕管之前 至少3周!
支架
支持:Python2和Python3
支持django版本:1.10、1.11、2.0、2.1、2.2
文档
完整的文档可在http://django-test-plus.readthedocs.org" rel="nofollow">http://django-test-plus.readthedocs.org获得
安装
$ pip install django-test-plus
用法
使用django test plus非常简单,只需让您的测试继承 从test_plus.test.testcase而不是普通的 django.test.testcase类似于so:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...
这足以让事情顺利进行,但我们鼓励您 根据每个项目创建自己的子类。这将允许您添加自己的特定于项目的助手方法。
例如,如果您有一个名为"myproject"的django项目,您可以
在myproject/test.py中创建以下内容:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass
然后在测试中使用:
frommyproject.testimportTestCaseclassMyViewTests(TestCase):...
请注意,如果需要,也可以选择这样导入它,即 更类似于django测试用例的常规导入:
fromtest_plusimportTestCase
pytest用法
现在,只需请求tp
,就可以获得一个类似testcase的对象作为pytest fixture。下面的所有方法都可以在pytest函数中工作。为了
例子:
deftest_url_reverse(tp):expected_url='/api/'reversed_url=tp.reverse('api')assertexpected_url==reversed_url
tp_api
fixture将提供一个使用django rest框架的apiclient()
的测试用例:
deftest_url_reverse(tp_api):response=tp_api.client.post("myapi",format="json")assertresponse.status_code==200
方法
反向(url_name,*args,**kwargs)
在测试视图时,您经常发现自己需要反转url的名称。对于django test plus,不需要来自django.core.urlsolvers的导入反向模板。只需使用:
deftest_something(self):url=self.reverse('my-url-name')slug_url=self.reverse('name-takes-a-slug',slug='my-slug')pk_url=self.reverse('name-takes-a-pk',pk=12)
正如你所看到的,我们的背面也会经过任何你需要的arg或kwarg。 通过。
获取(url_name,follow=true,*args,**kwargs)
你经常做的另一件事是http-get-url。我们的get()
方法
假设您传递的是一个带有任何必要参数或kwarg的命名url
以反转URL名称。
如果需要,将testclient.get()
的kwargs放在"额外"字典中。
deftest_get_named_url(self):response=self.get('my-url-name')# Get XML data via AJAX requestxml_response=self.get('my-url-name',extra={'HTTP_X_REQUESTED_WITH':'XMLHttpRequest'})
当使用这个get方法时,还有两件事发生在您身上,我们存储
在self.last_response
中的last response和self.context
中的响应上下文
所以不要:
$ pip install django-test-plus0
你可以写:
$ pip install django-test-plus1
它也很聪明,已经反向的网址,所以你可以懒惰和做:
$ pip install django-test-plus2
如果需要向url名称传递查询字符串参数,可以这样做。假设名称"search"映射到"/search/",则:
$ pip install django-test-plus3
会得到/search/?查询=测试
post(url_name,data,follow=true,*args,**kwargs)
我们的post()
方法接受一个命名的url,即您希望的数据字典
若要发布,则返回URL名称所需的任何参数或kwarg。
如有需要,将夸尔格用于testclient.post()
在"额外"字典中。
$ pip install django-test-plus4
注意除了常用的get和post,我们还以相同的方式支持所有http动词,如put、patch、head、trace、options和delete。
获取上下文(键)
通常需要从模板上下文中获取内容,所以让我们 易:
$ pip install django-test-plus5
断言文本(键)
您可以通过 使用:
$ pip install django-test-plus6
assertContext(键,值)
我们可以获取上下文值并确保它们存在,但是我们也要测试 当我们在这里的时候是平等的。这将断言键==值:
$ pip install django-test-plus7
响应xxx(响应,msg=none)-状态码检查
另一个你经常需要做的测试是检查一个响应是否有 HTTP状态代码。使用django的默认测试用例,您可以编写:
$ pip install django-test-plus8
使用django test plus,您可以将其缩短为:
$ pip install django-test-plus9
Django Test Plus为您提供以下响应方法检查:
- 响应_200()
- 响应_201()
- 响应_204()
- 响应_301()
- 响应_302()
- 响应_400()
- 响应_401()
- 响应_403()
- 响应_404()
- 响应_405()
- 响应_410()
所有这些都采用可选的django测试客户机响应和string msg参数 如果指定,则在发生故障时用作错误消息。 如果可用,response_xxx方法将使用最后一个响应。所以你 可以做到:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...0
这有点短。
获取检查(URL名称,*args,**kwargs)
获取和检查视图返回状态200非常常见 方法使之更容易::
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...1
设为用户(用户名='testuser',密码='password',perms=无)
在测试视图时,通常需要创建不同的用户来确保 你所有的逻辑都是安全可靠的。为了简化这个过程 方法将为您创建一个用户:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...2
如果在项目中创建用户比较复杂,例如
您从默认的django auth模型中删除了用户名
字段
您可以提供工厂
男孩要创建的工厂
或者直接在自己的子类上重写此方法。
要使用工厂男孩工厂,只需创建如下类:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...3
注意:使用此方法创建的用户将拥有其密码
默认设置为字符串"password",以便于测试。
如果您需要特定的密码,只需覆盖密码
参数即可。
您还可以通过传入一个字符串来传入用户权限
'<;应用程序名称>;<;永久名称>;
'或'<;应用程序名称>;*
'。例如:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...4
打印表单错误(响应或表单=无)
当调试带有窗体的视图的失败测试时,此方法将帮助您 快速查看任何表单错误。
示例用法:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...5
身份验证帮助程序
需要AssertLoginRequired(url_name,*args,**kwargs)
将新视图添加到项目中并忘记限制 如果需要登录,此方法有助于轻松测试 给定的命名URL需要验证:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...6
登录上下文
接下来的一个视图需要登录并创建用户 你最终要做的是以不同的用户身份登录来测试 限制逻辑。使用以下上下文可以更轻松地完成此操作:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...7
因为我们很可能使用上面的make_user()
创建用户,
除非指定,否则登录上下文假定密码为"password"
否则。因此您可以这样做:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...8
如果我们使用make_user()
也可以导出用户名,这样我们就可以
再缩短一点,如下所示:
fromtest_plus.testimportTestCaseclassMyViewTests(TestCase):...9
确保低查询计数
资产负债表han(数字)-上下文
Django提供 assertNumQueries 当代码生成特定数量的 查询。但是,如果由于数据的性质,这个数字可能会有所不同 您通常不会试图确保代码不会产生大量 比您预期的要多的查询:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass0
assertgoodview(url_name,*args,**kwargs)
这种方法为您做了一些事情,它:
- 检索名称url
- 确保视图不会生成超过50个查询
- 确保响应的状态代码为200
- 返回响应
通常像这样广泛的测试总比不测试好。你 可以这样使用:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass1
测试drf视图
为了利用drf的测试客户机的便利性,您可以创建testcase
的子类,并设置client\u类
属性:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass2
为了方便起见,test_plus
附带apitestcase
,这样做:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass3
请注意,使用apitestcase
需要django>;=1.8并已安装django rest framework
测试基于类的"通用"视图
testcase方法get()
和post()
都适用于基于函数的
以及基于类的视图。然而,在这样做的时候,他们调用了django的
url解析、中间件、模板处理和装饰系统。
对于集成测试,这是可取的,因为您希望确保
正确解析URL,强制执行查看权限等。
对于单元测试,这是昂贵的,因为所有这些django请求/响应
系统是在方法之外调用的,而它们通常不会
影响最终结果。
基于类的视图(派生自django的generic.models.view
类)
包含使颗粒单元测试(更)可行的方法和混合。
通常,泛型视图类的使用包含一个简单的重写
现有方法的。调用整个视图和django请求/响应
堆叠是浪费时间…你真的想调用重写的
直接测定并测试结果。
CBVTestcase去营救!
与上面的testcase一样,只需让您的测试继承 从test_plus.test.cbvtestcase而不是像这样的testcase:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass4
方法
获取实例(cls,initkwargs=none,request=none,*args,**kwargs)
这个核心方法简化了类的实例化,为您提供 一种直接调用类方法的方法。
返回cls
的实例,用initkwargs
初始化。
在类实例上设置请求
、参数
和kwargs
属性。
args
和kwargs
是传递给reverse()
的相同值
示例用法:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass5
获取(cls,initkwargs=none,*args,**kwargs)
调用cls.get()
并返回响应,如果可能,则呈现模板。
基于cbvtestcase.get_instance()基础。
所有test_plus.test.testcase方法都有效,因此可以执行以下操作:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass6
所有test_plus测试用例的副作用都得到认可,所有test_plus
testcase断言方法与cbvtestcase.get()
一起工作
注意:此方法绕过django的中间件,因此上下文 中间件创建的变量不可用。如果这影响到你 模板/上下文测试应该使用testcase而不是cbvtestcase。
post(cls,data=none,initkwargs=none,*args,**kwargs)
调用cls.post()
并返回响应,如果可能,则呈现模板。
基于cbvtestcase.get_instance()基础。
示例:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass7
所有测试加上测试用例的副作用D所有测试
testcase断言方法使用cbvtestcase.post()
注意:此方法绕过django的中间件,因此上下文 中间件创建的变量不可用。如果这影响到你 模板/上下文测试应该使用testcase而不是cbvtestcase。
获取检查(cls,initkwargs=none,*args,**kwargs)
工作方式与testcase.get_check_200()类似。 调用方必须提供视图类,而不是url名称或路径参数。
所有test_plus测试用例的副作用都得到认可,所有test_plus
testcase断言方法使用cbvtestcase.post()
assertgoodview(cls,initkwargs=none,*args,**kwargs)
工作方式与testcase.assertgoodview()
类似。
调用方必须提供视图类,而不是url名称或路径参数。
所有test_plus测试用例的副作用都得到认可,所有test_plus
testcase断言方法使用cbvtestcase.post()
开发
要处理django test plus本身,需要克隆此存储库并运行以下命令:
fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass8
注意:您还需要确保位于 在这个回购协议的根,是在您的virtualenv的路径。
保持联系!
如果您对这个项目有疑问,请打开一个github问题。如果您爱我们,并想了解我们的动态,可以在这里在线找到我们: