繁体   English   中英

使用 setUpTestData 进行 Django 测试不会在测试之间保持更改

[英]Django test with setUpTestData doesn't keep changes between tests

类方法 TestCase.setUpTestData()

上面描述的类级别原子块允许在 class 级别创建初始数据,一次用于整个 TestCase。

[...]

注意不要在测试方法中修改 setUpTestData() 中创建的任何对象。 在 class 级别完成的设置工作对内存对象的修改将在测试方法之间持续存在。

引用。 django.test.TestCase.setUpTestData

考虑这个例子:

class FoobarTest(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.post = Post()
        cls.post.stats = {}
        cls.post.save()

    def setUp(self):
        self.post.refresh_from_db()

    def test_foo(self):
        self.post.stats['foo'] = 1
        self.post.save()
        self.assertEquals(self.post.stats, {'foo': 1}) # this should fail

    def test_bar(self): # this run first cause alphabetical order
        self.post.stats['bar'] = 1
        self.post.save()
        self.assertEquals(self.post.stats, {'bar': 1})

自从

在 class 级别完成的设置工作对内存对象的修改将在测试方法之间持续存在

我预计两种测试方法中的一种会失败,导致 object post的属性也不同,并且相等性应该失败。

但是这个测试通过没有问题。

如果我强制执行顺序,它实际上表现得像预期的那样:

class FoobarTest(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.post = Post()
        cls.post.stats = {}
        cls.post.save()

    def setUp(self):
        self.post.refresh_from_db()

    def _foo(self):
        self.post.stats['foo'] = 1
        self.post.save()
        self.assertEquals(self.post.stats, {'foo': 1})

    def _bar(self):
        self.post.stats['bar'] = 1
        self.post.save()
        self.assertEquals(self.post.stats, {'bar': 1})

    def test_foo_bar(self):
        self._foo()
        self._bar() # this fail

问题是:

在第一个示例中,测试方法是否以某种并行方式运行? 他们真的会在一些与时间相关的巧合下失败吗?

Django 关于测试执行顺序的文档没有谈论测试方法。

这篇文章中,我发现测试方法的顺序可以更改,但是是一个接一个,没有并行性,除非我使用python manage.py test --parallel

这是我的测试,使用 memory 而不是数据库:

from django.test import TestCase

class Post(object):
    def __init__(self):
        self.stats = {}

    def refresh_from_db(self):
        pass

    def save(self):
        pass


class FoobarTest(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.post = Post()
        cls.post.stats = {}

    def setUp(self):
        self.post.refresh_from_db()

    def test_foo(self):
        self.post.stats['foo'] = 1
        self.post.save()
        self.assertEquals(self.post.stats, {'foo': 1})  # this should fail

    def test_bar(self):  # this run first cause alphabetical order
        self.post.stats['bar'] = 1
        self.post.save()
        self.assertEquals(self.post.stats, {'bar': 1})

这是我的结果:

    self.assertEquals(self.post.stats, {'foo': 1})  # this should fail
AssertionError: {'bar': 1, 'foo': 1} != {'foo': 1}
- {'bar': 1, 'foo': 1}
+ {'foo': 1}

将方法foo更改为afoo ,结果如预期:

    self.assertEquals(self.post.stats, {'bar': 1})
AssertionError: {'foo': 1, 'bar': 1} != {'bar': 1}
- {'bar': 1, 'foo': 1}
+ {'bar': 1}

所以也许这是一个数据库问题?

在您的断言中,您正在检查内存中的对象:如果save失败,则refresh_from_db返回起始的空 object,因此下一个检查通过。

尝试save后取回数据,然后检查它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM