【发布时间】:2016-11-02 16:10:20
【问题描述】:
我的单元测试和 django 管理事务的方式存在问题。
在我的代码中我有一个函数:
def send():
autocommit = transaction.set_autocommit(False)
try:
# stuff
finally:
transaction.rollback()
transaction.set_autocommit(autocommit)
在我的测试中我有:
class MyTest(TransactionTestCase):
def test_send(self):
send()
我遇到的问题是我的test_send 成功通过,但没有通过其他测试的 80%。
其他测试的事务似乎失败了
顺便说一句,我正在使用 py.test 运行我的测试
编辑: 为了让我在运行测试时更清楚 myapp.test.test_module.py 它运行良好,所有 3 个测试都通过了,但是当我运行所有测试时,大部分都失败了,将尝试生成一个测试应用程序
我的所有测试都通过 django 的默认测试运行程序通过
编辑2: 这是测试此问题的最小示例:
class ManagementTestCase(TransactionTestCase):
def test_transfer_ubl(self, MockExact):
pass
class TestTestCase(TestCase):
def test_1_user(self):
get_user_model().objects.get(username="admin")
self.assertEqual(get_user_model().objects.all().count(), 1)
请记住,有一个添加“管理员”用户的数据迁移(TestTestCase 单独成功,但在之前运行 ManagmentTestCase 时不会成功)
似乎自动提交与它无关。
【问题讨论】:
-
这个 send() 方法从何而来?请发布一个调用 send() 后失败的测试示例
-
我写了 send 方法,其他测试都失败了,因为当他们计数对象时,它们的隔离被破坏了
-
对不起,如果我的评论不清楚。发送方法是视图的一部分吗?部分测试代码?并且还请添加一个与这个一起执行时失败的测试样本
-
听起来您在测试用例之间存在依赖关系,并且依赖于 django 运行程序为您提供的guaranteed ordering...如果您按照 django 运行程序重新排序,py.test 是否有效?
-
@PeterBrittain 如果我将我的事务测试用例作为最后一次测试,一切正常,但如果我在下次启动测试时使用 --reuse-db,它们会失败
标签: python django pytest django-1.8