Django 单元测试在测试用例中如何/为什么相互影响,以及如何防止这种行为?
我正在为一个在Python3.6/Django 2.0中开发的webapp编写测试,我遇到了以下情况:Django 单元测试在测试用例中如何/为什么相互影响,以及如何防止这种行为?,django,python-3.x,unit-testing,django-unittest,Django,Python 3.x,Unit Testing,Django Unittest,我正在为一个在Python3.6/Django 2.0中开发的webapp编写测试,我遇到了以下情况: class TestFoo(TestCase): def test_a(self): obj = Foo.objects.create(a = "bar") expectation = {"a" : "bar"} self.assertEquals(obj.method_x(), expectation) def test_b(
class TestFoo(TestCase):
def test_a(self):
obj = Foo.objects.create(a = "bar")
expectation = {"a" : "bar"}
self.assertEquals(obj.method_x(), expectation)
def test_b(self):
obj = Foo.objects.create(a = "baz")
expectation = {"a" : "baz"}
self.assertEquals(obj.method_x(), expectation)
def test_c(self):
obj = Foo.objects.create(a = "bar")
obj2 = Foo.objects.create(a = "baz")
obj.b.add(obj2)
expectation = {"a" : "bar", "b" : {"a": "baz"}}
self.assertEquals(obj.method_x(), expectation)
据我所知,每个测试都是单独运行的,但当我在测试a或b旁边运行测试c时,所有测试都失败了。基本上:
- 测试a+测试b+测试c=全部失败
- 测试a+测试b=全部通过
- 测试c=全部通过
- 测试a+测试c=全部失败
- 测试b+测试c=全部失败
def method_x(self):
if not self.b:
return {"a": self.a}
else:
return {"a": self.a, "b":{"a":self.b.a}}
class Foo(models.Model):
A_TYPES = (
("bar", "Bar"),
("baz", "Baz")
)
a = models.CharFields(max_length20, choices=A_TYPES)
b = models.ManyToManyField("self")
c = models.IntegerField(null=True)
d = models.BooleanField(default=False)
该模型类似于:
def method_x(self):
if not self.b:
return {"a": self.a}
else:
return {"a": self.a, "b":{"a":self.b.a}}
class Foo(models.Model):
A_TYPES = (
("bar", "Bar"),
("baz", "Baz")
)
a = models.CharFields(max_length20, choices=A_TYPES)
b = models.ManyToManyField("self")
c = models.IntegerField(null=True)
d = models.BooleanField(default=False)
这可能需要更多关于模型和测试的细节。有两种情况可能会导致这种行为(最有可能的情况是:设置默认值存储在代码中而不是数据库中,因此第一个通过设置默认值将其称为“wins”的测试),但如果没有更详细的信息,就无法确定。我不确定情况是否如此。该方法只有两个相关属性('a'和'b'),所有其他属性默认为null/default值,在这些测试中设置的唯一属性是“a”,在测试c的情况下,在属性“b”上向自身添加了多个关系。但即使这样也不相关,因为如果我做的测试d本身没有多个关系,测试将失败。我将添加模型详细信息st in case though您在扩展哪个
TestCase
呢?大概是Django的版本,而不是unittest.TestCase
?这是正确的,但是从我所读到的Django TestCase扩展了python测试用例,所以我认为它们的工作原理类似,您可以仅使用您在这里发布的简化代码来重现行为吗?