编写Django Rest Framework(DRF)测试时的提示

目标

我收集了一些在编写Django测试时可能会有点方便的小技巧。

前提-限于中国工人的福利状况

    • テストコードの書き方については説明しません。

 

    • この記事内では、Tipsの紹介にとどめ、詳細については記載しません。

 

    • DRFをインストールするだけで使えるものに絞っています。

 

    unittestに元々備わっている機能と、djangoが拡張した機能を混ぜて紹介しています。違いが分かるように各Tips紹介の頭に目印をつけています。

版本

Django==4.1.9
djangorestframework==3.14.0

小贴士

运行时选项

保持数据库

Django

每次执行测试无需重新创建测试数据库,因此可以缩短执行时间。

python manage.py test --keepdb

标签

Django只需要一个选择。

通过给测试用例打标签,您可以只运行指定标签的测试用例。
另外,您也可以选择不运行特定标签的测试用例。
https://docs.djangoproject.com/en/4.2/topics/testing/tools/#tagging-tests

from django.test import tag

class SampleTestCase(TestCase):
    @tag("fast")
    def test_fast(self):
        ...

    @tag("slow")
    def test_slow(self):
        ...

    @tag("slow", "core")
    def test_slow_but_core(self):
        ...
python manage.py test --tag=fast --tag=core
python manage.py test --exclude-tag=slow

测试名称模式

单元测试

如果您在-k选项中指定了一个字符串,那么只会执行包含该字符串的测试类和测试用例。

举个例子,对于-k foo,会匹配到foo_tests.SomeTest.test_something和bar_tests.SomeTest.test_foo,但不会匹配到bar_tests.FooTest.test_something。

python manage.py test -k foo

设置

Django : 码头

如果有多个settings.py文件,您可以在执行测试命令时进行切换。

python manage.py test --settings=config.settings.test

考试代码 (

继承自父类

Django 写原生中文

我认为在测试类的继承中,通常会选择DRF中的rest_framework.APITestCase作为父类。但是,如果不需要发送请求或者不需要进行数据库连接的话,django.test.testcases.SimpleTestCase就足够了。

在执行速度和明确不需要API和DB连接这两个方面来看,我认为最好将继承的父类进行区分。

その他のテストクラス

灯具

Django(中文名:詹戈)可以是以下解释:

在进行使用数据库进行测试时,可以使用fixture来插入数据。

class SampleTestCase(APITestCase):
    fixtures = ["test.json"]

可以使用 manage.py dumpdata 来创建 fixture。
有关详细的创建方法,请参考此处等。

    • https://docs.djangoproject.com/en/4.2/ref/django-admin/#dumpdata

 

    https://marsquai.com/745ca65e-e38b-4a8e-8d59-55421be50f7e/05f253f8-c11b-4c91-8091-989eb2600a7b/229d6ef3-1ba3-4e16-bdd7-c5f01c6dfb12/

建立

Django单元测试

在unittest.test.TestCase中提供了以下的方法。

setUpClass()

 

在测试类开始时被调用一次。

setUp()
在每个测试用例开始时被调用。

tearDown()
在每个测试用例结束时被调用。

tearDownClass()
在测试类结束时被调用一次。

此外,在django.test.testcases.TestCase中还添加了以下方法。

在setUpClass的最后调用setUpTestData()。

通过重写这些方法,可以简洁地编写共同的前处理和后处理。

class SampleTestCase(APITestCase):

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        ...

    @classmethod
    def setUpTestData(cls):
        ...

    def setUp(self):
        ...

在TestCase中,我们将setUpClass()进行了如下覆写:
按照以下顺序执行事务的开始、插入fixtures、setUpTestData。
因此,当覆写setUpClass()时,应首先使用super()来调用父类的setUpClass()。

留言

单元测试

如果为每个测试用例编写docstring,并在运行时将-v选项设置为2或更高时,将输出其内容。

class SampleTestCase(APITestCase):
    def test_case(self):
        """サンプルテストケースです"""
        ...

---
test_case (project.app.test.SampleTestCase)
サンプルテストケースです ... ok

最后

如果还有其他的类似技巧,请一定在评论中告诉我,我将不胜感激。

bannerAds