尽管是TestCase,但Django测试数据仍可跨多个测试持久

时间:2018-09-18 18:33:34

标签: django unit-testing testing django-testing pytest-django

我有一个使用setUp的测试用例,看起来像这样:

from django.test import TestCase, Client, TransactionTestCase
...
class TestPancakeView(TestCase):

    def setUp(self):
        self.client = Client()

        # The Year objects are empty (none here - expected)
        print(Year.objects.all())

        # When I run these Test by itself, these are empty (expected)
        # When I run the whole file, this prints out a number of
        # Pancake objects causing these tests to fail - these objects appear
        # to be persisting from previous tests
        print(Pancake.objects.all())

        # This sets up my mock/test data
        data_setup.basic_setup(self)

        # This now prints out the expected years that data_setup creates
        print(Year.objects.all())

        # This prints all the objects that I should have 
        # But if the whole file is ran - it's printing objects
        # That were created in other tests
        print(Pancake.objects.all())

        [...tests and such...]

data_setup.py是一个文件,仅在需要时为我的测试创建所有适当的测试数据。我正在使用Factory Boy创建测试数据。

当我自己运行TestPancakeView时-我的测试通过了预期的测试。

当我运行整个test_views.py文件时,我的TestPancakeView测试失败。

如果我将其更改为TransactionTestCase-运行整个文件时仍然失败。

我正在创建Pancake测试数据,如下所示:

        f.PancakeFactory.create_batch(
            2,
            flavor=blueberry,
            intensity='high'
        )

没有其他测试表现出这种行为,当我单独运行它们或将它们作为整个文件的一部分运行时,它们的行为均相同。

1 个答案:

答案 0 :(得分:0)

所以我发现原因是因为我的Pancake类来自Django项目中的另一个应用程序(该应用程序绑定到另一个数据库表)。因此-当我最初创建这些对象时-由于它们存在于不同的测试数据库中,因此它们可以持久保存。

解决方案:

对每个测试使用tearDown功能。

每个测试现在具有以下内容:

def tearDown(self):
    food.Pancake.objects.all().delete()

这可确保在每次测试后都删除我的Pancake对象-因此,我对Pancake的测试特别通过了,无论是单独运行还是与文件其余部分一起运行。