尽管是 TestCase,但 Django 测试数据在多个测试中持续存在
Django test data persisting across multiple tests despite being TestCase
我有一个使用 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'
)
没有其他测试表现出这种行为,当我 运行 它们单独或当我 运行 它们作为整个文件的一部分时,它们都以相同的方式运行。
所以我发现这是因为我的Pancake
class来自Django项目中的不同应用程序(绑定到不同的DB table);正因为如此 - 当我最初创建这些对象时 - 因为它们存在于不同的测试数据库中,所以它们一直存在。
解决方案:
对每个测试使用 tearDown
功能。
每个测试现在都有以下内容:
def tearDown(self):
food.Pancake.objects.all().delete()
这确保我的 Pancake
对象在每次测试后都被删除 - 所以我针对 Pancake
的测试特别通过,无论是 运行 本身还是与文件的其余部分.
我有一个使用 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'
)
没有其他测试表现出这种行为,当我 运行 它们单独或当我 运行 它们作为整个文件的一部分时,它们都以相同的方式运行。
所以我发现这是因为我的Pancake
class来自Django项目中的不同应用程序(绑定到不同的DB table);正因为如此 - 当我最初创建这些对象时 - 因为它们存在于不同的测试数据库中,所以它们一直存在。
解决方案:
对每个测试使用 tearDown
功能。
每个测试现在都有以下内容:
def tearDown(self):
food.Pancake.objects.all().delete()
这确保我的 Pancake
对象在每次测试后都被删除 - 所以我针对 Pancake
的测试特别通过,无论是 运行 本身还是与文件的其余部分.