能否请任何人解释一下TestCase类和TransactionTestCase类之间的区别。我已经阅读了该文档,但仅是说TestCase在数据库事务中运行测试,并使用回滚来“撤消”数据库中的测试,如果您需要在测试中手动管理事务,则需要使用django.test.TransactionTestCase 。
您能帮我举例说明实际差异吗?我只想知道TestCase在什么情况下失败?是否回滚是自动进行的,还是我们必须编写回滚语句?
请帮我
TestCase
和之间的主要区别是,TransactionTestCase
始终TestCase
使用atomic()
块包装测试。从文档中:
将测试包装在两个嵌套的atomic()块中:一个用于整个类,一个用于每个测试
现在假设您有一个方法,如果未包装在atomic()
块中,则应该引发错误。您正在尝试为此编写测试:
def test_your_method_raises_error_without_atomic_block(self):
with self.assertRaises(SomeError):
your_method()
该测试将意外失败!您猜到原因是,TestCase
测试始终用atomic()
块包装测试。因此,your_method()
不会引发错误,这就是该测试将失败的原因。在这种情况下,您应该使用TransactionTestCase进行测试。
select_for_update()是一个明显的例子:
在支持SELECT ... FOR UPDATE的后端上,在自动提交模式下使用select_for_update()评估查询集是一个TransactionManagementError错误
使用TestCase类,您不能测试在事务中是否正在执行代码块,这是使用select_for_update()时所必需的
如果我们查看的文档,则会select_for_update()
看到警告:
尽管select_for_update()通常在自动提交模式下会失败,但是由于TestCase自动将每个测试包装在事务中,因此即使在atomic()块之外调用TestCase中的select_for_update()也会(也许是意外地)通过而不会引发TransactionManagementError。要正确测试select_for_update(),应使用TransactionTestCase。
希望能帮助到你!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句