Django Rest Framework中的APITestCase、APISimpleTestCase和APITransactionTestCase有哪些不同的用例?

6

这里是不同测试用例类的文档:这里

我不确定在哪些情况下应该使用每个测试用例类:

  • APITestCase
  • APISimpleTestCase
  • APITransactionTestCase
1个回答

16
Django Rest Framework文档所解释的那样,有3个可用的测试类只是扩展了常规的Django测试类,但切换客户端使用APIClient
这也可以在Django Rest Framework源代码中看到。
class APITransactionTestCase(testcases.TransactionTestCase):
    client_class = APIClient


class APITestCase(testcases.TestCase):
    client_class = APIClient


class APISimpleTestCase(testcases.SimpleTestCase):
    client_class = APIClient

你需要了解的第一个测试用例是 APISimpleTestCase,它允许我们测试一般的DRF/Django事物,如HTTP重定向并检查某个可调用对象是否引发异常。文档指出,当进行任何涉及数据库的测试时,不应使用 APISimpleTestCase

之所以不应该在数据库中使用 APISimpleTestCase,是因为测试数据会在多个测试之间保留在数据库中。为了解决这个问题,我们必须使用 APITransactionTestCase,它将使用 atomic()块将测试包装在事务中,并允许测试运行程序在每个测试开始时回滚数据库,从而轻松地进行数据库相关操作的原子测试。它还添加了一些与数据库断言相关的额外断言方法,例如assertNumQueries

最后,APITestCase 使用两个 atomic() 块将测试包装起来,一个用于整个测试类,另一个用于类中的每个测试。这基本上阻止了测试为其他测试更改数据库,因为事务在每次测试结束时回滚。通过在整个测试类周围使用这个第二个 atomic() 块,特定的数据库事务行为可能很难进行测试,因此您需要回退到使用 APITransactionTestCase


APITransactionTestCase在包装测试时未使用atomic()块。它使用截断来消除测试后的更改。请参见https://docs.djangoproject.com/en/3.1/topics/testing/tools/#transactiontestcase。 - voneiden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接