编写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
最后
如果还有其他的类似技巧,请一定在评论中告诉我,我将不胜感激。