【问题标题】:What are the different use cases for APITestCase, APISImpleTestCase, and APITransactionTestCase in Django Rest FrameworkDjango Rest Framework 中的 APITestCase、APISImpleTestCase 和 APITransactionTestCase 有哪些不同的用例
【发布时间】:2017-12-22 16:56:23
【问题描述】:

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

我不确定我会在什么情况下使用每个测试用例类:

  • APITestCase
  • APISimpleTestCase
  • APITransactionTestCase

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多