【发布时间】:2017-12-22 16:56:23
【问题描述】:
【问题讨论】:
标签: python api unit-testing django-rest-framework
【问题讨论】:
标签: python api unit-testing django-rest-framework
正如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。
【讨论】: