Django单元测试:分离单元测试而无需多次查询数据库

时间:2019-01-17 18:54:39

标签: django unit-testing

我有这样的一对测试:

确保任务的删除状态初始化为“无”

def test_initial_task_deletion_status_is_none(self):
    unfinished_task = Task.objects.get(tasked_with="Unfinished Test")
    self.assertIsNone(unfinished_task.delete_status)

# Make sure a task's deletion status changes appropriately
def test_unfinished_task_deletion_status_updates_appropriately(self):
    unfinished_task = Task.objects.get(tasked_with="Unfinished Test")
    unfinished_task.timed_delete(delta=.1)
    self.assertIs(unfinished_task.delete_status, "Marked for Deletion")

这将继续,但是我将在每个人的开头加上unfinished_task = Task.objects.get(tasked_with="Unfinished Test")。有没有一种方法可以将这些类型的东西分成单独的测试,但是使用相同的查询结果?

2 个答案:

答案 0 :(得分:1)

假设您使用的是Django's testing framework,则可以使用setUp()进行此操作。 有关unittest.TestCase.setUp() here

的更多信息

所以您更新的代码段如下所示:

from django.test import TestCase

class MyTestCase(TestCase):
    def setUp(self):
        self.unfinished_task = Task.objects.get(tasked_with="Unfinished Test")

    def test_initial_task_deletion_status_is_none(self): 
        self.assertIsNone(self.unfinished_task.delete_status)

    # Make sure a task's deletion status changes appropriately
    def test_unfinished_task_deletion_status_updates_appropriately(self):
        self.unfinished_task.timed_delete(delta=.1)
        self.assertIs(self.unfinished_task.delete_status, "Marked for Deletion")

答案 1 :(得分:1)

您可以在setUp方法中放置重复的行,这将减少代码的重复性,但是正如DanielRoseman指出的那样,它仍将在每次测试中运行,因此您将不会使用相同的查询结果。

您可以将其放在setUpTestData方法中,并且在MyTestCase中的所有测试之前,它将仅运行一次,但是您的unfinished_task对象将是一个类变量,在所有测试中共享。在一次测试中对对象进行的内存中修改将延续到后续测试中,这不是您想要的。

在只读测试中,使用setUpTestData是消除不必要查询的好方法,但是如果要修改对象,则每次都需要重新启动。