1

首先,这是 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>在测试成功运行时被删除的原因,或者为什么单个测试用例会自行失败,但不能与完整的测试套件一起使用.

4

0 回答 0