首先,这是Django 1.9.13。我意识到这是一个不受支持的版本,但我必须使用它的原因。数据库是postgres 9.6。
我有一个项目,运行大约40个测试,分为几个文件。所有测试用例都是TransactionTestCase
,通过fixture = ['fixture_name.json']
加载自己的灯具我在app/fixtures
目录中使用类似于
base_data.json
test_a_data.json
test_b_data.json
...
基本数据用于大多数(如果不是全部)测试用例。但其他灯具用于1次或少量测试。
运行它的设置是
'test': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'HOST': 0.0.0.0,
'PORT': 5432,
'NAME': <database>,
'USER': <user>,
'PASSWORD': <pass>,
'TEST': {
'NAME': 'test_database'
}
}
运行以下命令时,它运行正常
python manage.py app.test -v 1 --keepdb
但是,在运行单个测试用例时,它会失败
python manage.py app.test.test_A.ATestCase -v 1 --keepdb
失败
IntegrityError: Problem installing fixture '/app/fixtures/test_a_data.json': Could not load <object>(pk=1): duplicate key value violates unique constraint "<uniq_constraint_name>"
DETAIL: Key <key> already exists.
好像夹具正在加载两次。我已经尝试检查SQL Django正在使用的SQL,并发现有问题的对象只加载一次。但是,对象确实存在于<database>
而不是<test_database>
。
这引出了我问题的第二部分。
当我运行完整的测试套件时,它运行正常,甚至测试上面的灯具在自己运行时出错的地方。
但是,在成功运行测试套件后,后续测试套件运行失败,并且在检查<database>
时,所有表现在都是空的。我试图通过检查SQL查询来调试它,但日志在4MB后停止。由于我无法成功运行单个TestCase
,因此我无法理解表行被删除并查看可能正在拆除数据库中数据的内容。
我已经搜索过任何我能找到的Django测试文档,并且无法找到任何可以解释为什么<database>
在测试成功运行时被删除的原因,以及为什么单个测试用例自行失败的原因,但不是在完整的测试套件旁边。