首页 > 解决方案 > Django REST框架测试用例顺序

问题描述

我想测试 Django 应用程序的 API。例如,我有这些 API:

我这样写 test.py :

class UserTest(APITestCase):

   def test_register(self):
      # ...
      # self.assertEqual( ... )

   def test_login(self):
      # ...
      # login with registered user (test_register function)

test_register工作正常,但test_login工作。

test_login运行时,我在test_register中创建的用户在数据库中不存在。

如何在测试过程中保持数据库的状态?

以及如何设置测试类的运行顺序?

标签: pythondjangotestingdjango-rest-framework

解决方案


单元测试应该彼此独立,因此顺序应该无关紧要。如果你需要在每次测试之前执行一个动作,比如创建一个全新的用户,你应该把它放在setUp函数中

然后,如果您需要您的用户注册登录测试,只需在测试中手动进行。基本上:

  • test_register是测试注册工作流程
  • test_login是测试登录工作流程,你可以在那里手动设置注册状态(你这里不测试)
class UserTest(APITestCase):
   
   def setUp(self):
       # call super().setUp() if necessary
       self.user = User.objects.create_user(**your_data)
       # More stuff

   def test_register(self):
      # ...
      # self.assertEqual( ... )

   def test_login(self):
      self.user.register() # or any action required
      # ...
      # login with registered user (test_register function)

编辑:仅供参考,测试用例中有 4 个非常有用的钩子:

  • setUpClass: 发生在 FIRST 测试之前
  • setUp: 在每次测试之前发生
  • tearDown:每次测试后都会发生
  • tearDownClass:在最后一次测试之后发生

您将经常使用该setUp功能来准备您的数据库,而不是什么(因为它会在每次测试后自动重置)


推荐阅读