我正在尝试提供测试仅POST端点的最佳方法,该端点获取有效负载并从该数据创建6个不同的对象。我试图发送有效负载,然后断言应创建所有应创建的对象。最后一个块(在新行之后)尝试重新发布相同的负载并确保没有创建重复项。
我的问题是,如果我运行此测试,是否使用现有数据库?或者它是否设置了一个" mock"数据库并在测试运行后将其拆除?我不希望任何这些数据弄脏我的数据库。
class APITests(APITestCase):
def test_job_start(self):
url = '/api/v1/job_start/'
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Platform.objects.count(), 1)
self.assertEqual(Platform.objects.get().name, 'andr')
self.assertEqual(CdTool.objects.count(), 1)
self.assertEqual(CdTool.objects.get().name, 'https://jenkins-andr.test.com')
self.assertEqual(Job.objects.count(), 1)
self.assertEqual(Job.objects.get().name, 'ANDR_master_CI')
self.assertEqual(JobExecution.objects.count(), 1)
self.assertEqual(JobExecution.objects.get().build_id, '3500')
# Send the same payload, make sure no duplicate records are created
response = self.client.post(url, data, format='json')
self.assertEqual(Platform.objects.count(), 1)
self.assertEqual(CdTool.objects.count(), 1)
self.assertEqual(Job.objects.count(), 1)
self.assertEqual(JobExecution.objects.count(), 1)
答案 0 :(得分:1)
1)来自官方Django documentation:
需要数据库的测试(即模型测试)不会使用您的“真实”(生产)数据库。为测试创建单独的空白数据库。无论测试是通过还是失败,测试数据库都会在执行完所有测试后被销毁。
2)您的APITestCase
扩展TestCase
,根据docs:
另一方面,TestCase在测试后不会截断表。相反,它将测试代码包含在测试结束时回滚的数据库事务中。可以由transaction.atomic()引起的显式提交(如event.commit()和隐式提交)替换为nop操作。这可以保证测试结束时的回滚将数据库恢复到初始状态。