Django测试中TestCase和TransactionTestCase类之间的区别

毗湿奴mc:

能否请任何人解释一下TestCase类和TransactionTestCase类之间的区别。我已经阅读了该文档,但仅是说TestCase在数据库事务中运行测试,并使用回滚来“撤消”数据库中的测试,如果您需要在测试中手动管理事务,则需要使用django.test.TransactionTestCase 。

您能帮我举例说明实际差异吗?我只想知道TestCase在什么情况下失败?是否回滚是自动进行的,还是我们必须编写回滚语句?

请帮我

Jahongir Rahmonov:

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错误

TransactionTestCase文档中

使用TestCase类,您不能测试在事务中是否正在执行代码块,这是使用select_for_update()时所必需的

如果我们查看的文档,则会select_for_update()看到警告:

尽管select_for_update()通常在自动提交模式下会失败,但是由于TestCase自动将每个测试包装在事务中,因此即使在atomic()块之外调用TestCase中的select_for_update()也会(也许是意外地)通过而不会引发TransactionManagementError。要正确测试select_for_update(),应使用TransactionTestCase。

希望能帮助到你!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Django中进行测试:TestCase类中的setUpClass,setUpTestData和setUp有什么区别?

Django中模型类和模型实例之间的区别(文档)

Scala中对象和类之间的区别

Java和JavaScript中的类之间的区别?

Python中模块和类之间的区别

Typescript中的接口和类之间的区别

Django和“普通” Python中的类成员和实例成员之间的区别?

Django中AbstractUser和AbstractBaseUser之间的区别?

URL和Django中的路径之间的区别?

java中的GregorianCalendar类和Calendar类之间的区别?

气流中“气流运行”和“气流测试”之间的区别

集成测试中MockMvc和RestTemplate之间的区别

Julia中基准测试和时间宏之间的区别

测试容器中StartupCheckStrategy和WaitStrategy之间的区别

验收测试和功能测试之间的区别?

功能测试和集成测试之间的区别

类和模块之间的区别

类和类型之间的区别

对象和类之间的区别

LLVM:指令或值类中“用途”和“用户”之间的区别

机器学习中参数,特征和类之间的区别

C#中的Pipeline和PowerShell类之间的区别

Kotlin:类中的对象和伴侣对象之间的区别

Java SDK中的AmazonDynamoDBClient和DynamoDB类之间的区别?

Python中抽象类和接口之间的区别

Java中静态类型和动态类之间的区别

java String类中subSequence和subString方法之间的区别

MappedDiagnosticsLogicalContext类中的Set方法和SetScoped方法之间的区别

Typescript中的类和名称空间之间的区别