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

2 python api unit-testing django-rest-framework

对于不同的测试用例类的文档是在这里

我不确定我将使用每个测试用例类的情况:

  • APITestCase
  • APISimpleTestCase
  • APITransactionTestCase

mat*_*gan 9

正如Django Rest Framework Docs中所解释的那样,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
Run Code Online (Sandbox Code Playgroud)

你应该知道的第一个测试用例是APISimpleTestCase允许我们测试一般的DRF/Django事情,比如http重定向和检查一些可调用引发异常.文档指出我们APISimpleTestCase在对数据库进行任何测试时都不应该使用.

我们不应该使用APISimpleTestCase数据库的原因是因为测试数据将跨多个测试保留在数据库中.为了解决这个问题,我们必须使用APITransactionTestCase哪些将使用atomic()块来包装事务中的测试,并允许测试运行器在每次测试开始时回滚数据库,从而允许对数据库相关操作进行简单的原子测试.它还添加了一些与数据库断言相关的额外断言方法,例如assertNumQueries.

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