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_apifixture将提供一个使用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-plus
0

你可以写:

$ pip install django-test-plus
1

它也很聪明,已经反向的网址,所以你可以懒惰和做:

$ pip install django-test-plus
2

如果需要向url名称传递查询字符串参数,可以这样做。假设名称"search"映射到"/search/",则:

$ pip install django-test-plus
3

会得到/search/?查询=测试

post(url_name,data,follow=true,*args,**kwargs)

我们的post()方法接受一个命名的url,即您希望的数据字典 若要发布,则返回URL名称所需的任何参数或kwarg。 如有需要,将夸尔格用于testclient.post()在"额外"字典中。

$ pip install django-test-plus
4

注意除了常用的get和post,我们还以相同的方式支持所有http动词,如put、patch、head、trace、options和delete。

获取上下文(键)

通常需要从模板上下文中获取内容,所以让我们 易:

$ pip install django-test-plus
5

断言文本(键)

您可以通过 使用:

$ pip install django-test-plus
6

assertContext(键,值)

我们可以获取上下文值并确保它们存在,但是我们也要测试 当我们在这里的时候是平等的。这将断言键==值:

$ pip install django-test-plus
7

响应xxx(响应,msg=none)-状态码检查

另一个你经常需要做的测试是检查一个响应是否有 HTTP状态代码。使用django的默认测试用例,您可以编写:

$ pip install django-test-plus
8

使用django test plus,您可以将其缩短为:

$ pip install django-test-plus
9

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):pass
0

assertgoodview(url_name,*args,**kwargs)

这种方法为您做了一些事情,它:

  • 检索名称url
  • 确保视图不会生成超过50个查询
  • 确保响应的状态代码为200
  • 返回响应

通常像这样广泛的测试总比不测试好。你 可以这样使用:

fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass
1

测试drf视图

为了利用drf的测试客户机的便利性,您可以创建testcase的子类,并设置client\u类属性:

fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass
2

为了方便起见,test_plus附带apitestcase,这样做:

fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass
3

请注意,使用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):pass
4

方法

获取实例(cls,initkwargs=none,request=none,*args,**kwargs)

这个核心方法简化了类的实例化,为您提供 一种直接调用类方法的方法。

返回cls的实例,用initkwargs初始化。 在类实例上设置请求参数kwargs属性。 argskwargs是传递给reverse()的相同值

示例用法:

fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass
5

获取(cls,initkwargs=none,*args,**kwargs)

调用cls.get()并返回响应,如果可能,则呈现模板。 基于cbvtestcase.get_instance()基础。

所有test_plus.test.testcase方法都有效,因此可以执行以下操作:

fromtest_plus.testimportTestCaseasPlusTestCaseclassTestCase(PlusTestCase):pass
6

所有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):pass
7

所有测试加上测试用例的副作用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):pass
8

注意:您还需要确保位于 在这个回购协议的根,是在您的virtualenv的路径。

保持联系!

如果您对这个项目有疑问,请打开一个github问题。如果您爱我们,并想了解我们的动态,可以在这里在线找到我们:

标签:

  • django
  • 方法
  • from
  • test
  • import
  • 视图
  • url
  • 测试用例
  • plus
  • testcase
  • 欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    java Spring数据JPA+Hibernate在不首先找到父实体的情况下保存子实体   php Java:如何从CLI接收命令   spring为java中的导出数据创建访问文件   java在Windows 8.1上安装Play Framework   java Spring启动白标签错误页面(类型=未找到,状态=404)   java如何在单击时从数组中绘制?   java fn:substringAfter()上次出现   java在IFR语句中使用方法返回   java onPause()或onStop()的名称   对关联对象的关联对象具有条件的java HQL查询   java只打印一次总值,无需迭代   java如何使用抽象Uri buildOn()方法?   如何在Java中执行sudo命令并获得错误输出?   java反射:避免对getConstructor(类<?>…)的未经检查的警告调用作为原始类型类的成员   Java:如何从类中创建的对象调用类方法?   java如何在电子邮件中嵌入图像?   java如何在Android上启用详细GC?   java什么是串行版本id?