我正在为我的项目编写测试用例,我必须使用夹具来获取数据。对于整个项目来说,fixture 相当大(大约 20 MB)。由于该项目涉及多个应用程序,因此我希望在运行测试时只加载一次夹具。在每个测试用例上指定固定装置以及使用 keepdb 标志效果不佳,并且所有测试都需要花费大量时间。您能否为此提出一个好的解决方法,以便我加快速度。我也关注了这个post但它不适用于 django 1.9。
添加了示例测试 App1/测试.py
from django.test import TestCase
class App1View1TestCase(TestCase):
fixtures = [
'fixtures/app_fixture.json',
]
class App1View2TestCase(TestCase):
fixtures = [
'fixtures/app_fixture.json',
]
class App1View3TestCase(TestCase):
fixtures = [
'fixtures/app_fixture.json',
]
App2/测试.py
from django.test import TestCase
class App2View1TestCase(TestCase):
fixtures = [
'fixtures/app_fixture.json',
]
class App2View2TestCase(TestCase):
fixtures = [
'fixtures/app_fixture.json',
]
class App2View3TestCase(TestCase):
fixtures = [
'fixtures/app_fixture.json',
]
每个测试用例有 5 个以上的测试。
最佳答案
加快夹具加载速度。
首先,您需要 CSV 格式的夹具。如果您已经安装了 CSV 序列化程序,那么您很幸运。或者连接 psql 或 pgadmin 并创建 CSV 转储并跳过下一位。
要从现有的夹具创建 CSV,只需一个测试,将 -k
标志设置为 manage.py test
,这与 --keepdb
,像这样:
./manage.py test -k myapp.test.App2View1TestCase.test_something
现在,您已经创建了包含所有表的测试数据库。
在 settings.py DATABASES 部分添加一个条目指向测试数据库(通常你的数据库名称以 test 为前缀)。现在 manage.py loaddata
来自你的夹具。然后你需要打开你的 psql 控制台并使用 COPY TO 将该数据转储为 CSV。 .您需要为每个表执行此操作。
我知道这听起来工作量很大,但您只需要做一次。但是好的,我们如何加载它?覆盖 setUpTestData方法并添加如下代码:
@classmethod
def setUpTestData(cls):
cursor = connection.cursor()
cursor.execute("COPY table(fields) FROM dump_file.csv")
您会发现这比使用 loaddata(通过 fixtures = [] 完成的)快得多,并且一旦加载了夹具,它就会被类中的所有测试使用。
对所有测试用例使用相同的夹具
不是覆盖 setUpTestData,而是覆盖 setUpClass
@classmethod
def setUpClass(cls):
if not MyModel.objects.count():
cursor = connection.cursor()
cursor.execute("COPY table(fields) FROM dump_file.csv")
super(TestCase, cls).setUpClass()
免责声明:我自己没有使用过这种方法。
关于python - 如何确保 django 1.9 中的所有测试用例只加载一次夹具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173200/