首先,这是 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.
好像夹具被加载了两次。我试过检查 Django 正在使用的 SQL,发现有问题的对象只加载了一次。但是,该对象确实存在于<database>
not<test_database>
中。
这导致我进入问题的第二部分。
当我运行完整的测试套件时,它运行良好,甚至可以测试上述装置在自行运行时出错的情况。
但是,在成功运行测试套件后,后续测试套件运行失败,并且在检查<database>
所有表时现在都是空的。我试图通过检查 SQL 查询来调试它,但日志在 4MB 后停止。而且由于我无法成功运行单个TestCase
,我无法达到删除表行并查看可能会破坏数据库中数据的程度。
我已经搜索了我能找到的任何 Django 测试文档,但找不到任何可以解释为什么<database>
在测试成功运行时被删除的原因,或者为什么单个测试用例会自行失败,但不能与完整的测试套件一起使用.