settings
Django
运行单元测试时,会以settings
里的数据库配置里的NAME
新建一个以test_
开关的临时数据库,并在测试结束后删除,默认的测试数据库会以当前的migrations
文件来创建数据表并进行迁移,但如果migrations
文件很多,每次运行时间将很久,所以可以跳过迁移,直接以当前Model
结果来创建表以提升测试效率,如果想进一步加快测试时创建数据库的速度,可以使用SQLite
数据库引擎,当使用SQLite
数据库引擎时,测试将默认使用内存数据库。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'
if TESTING:
# 当使用SQLite数据库引擎时,测试将默认使用内存数据库
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
}
# 单元测试时, 跳过migrate, 极 的提升测试运 效率
# 具体可以查看
# https://simpleisbetterthancomplex.com/tips/2016/08/19/django-tip-12-disabl ing-migrations-to-speed-up-unit-tests.html
# https://stackoverflow.com/questions/36487961/django-unit-testing-taking-a- very-long-time-to-create-test-database
class DisableMigrations(object):
def __contains__(self, item):
return True
def __getitem__(self, item):
return "notmigrations"
MIGRATION_MODULES = DisableMigrations()
示例代码
1 | # -*- coding: utf-8 -*- |
断言
1 | # 来自unittest.case.TestCase |
测试接口地址
测试接口地址建议使用硬编码,不要使用reverse
反解析url,原因是接口地址尽量避免改变,如果必须修改,需要以很明显的方式来提醒开发人员以便开发人员通知接口使用人员。
测试数据准备
有如下两种方法准备测试数据
- 简单的数据可以在
setUp()
里来创建; - 复杂数据可以使用fixtures来写,并在赋值给测试类的
fixtures
属性;
fixtures数据示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]
测试覆盖率(coverage)
在Pycharm
里可以通用右键项目,选择Run 'Test:' with Coverage
来查看测试的覆盖率。也可以通过其它第三方包查看测试覆盖率,具体请自己查询。