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

时间:2017-07-18 02:08:54

标签: python api unit-testing django-rest-framework

不同测试用例类的文档是here

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

  • APITestCase
  • APISimpleTestCase
  • APITransactionTestCase

1 个答案:

答案 0 :(得分:7)

正如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

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

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

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