是否在unittest中的测试之间保持变量更改?

2024-09-28 22:05:01 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将从unitttest中的TestCase继承的同一对象中所做的更改持久化?

from unittest import TestCase, main as unittest_main


class TestSimpleFoo(TestCase):
    foo = 'bar'

    def setUp(self):
        pass

    def test_a(self):
        self.assertEqual(self.foo, 'bar')
        self.foo = 'can'

    def test_f(self):
        self.assertEqual(self.foo, 'can')


if __name__ == '__main__':
    unittest_main()

我想通过上面的两个测试


Tags: 对象fromtestimportselffoomaindef
3条回答

我喜欢你自己的答案,因为它很简单,但是如果你想保持不同的单元测试:

显然unittest使用TestCase的新实例运行单独的测试。好吧,只需将对象绑定到除了自身之外的其他对象。例如:

from unittest import TestCase, main as unittest_main


class TestSimpleFoo(TestCase):

    def setUp(self):
        pass

    def test_a(self):
        TestSimpleFoo.foo = 'can'

    def test_f(self):
        self.assertEqual(TestSimpleFoo.foo, 'can')


if __name__ == '__main__':
    unittest_main()

您可能也对setUpClass和tearDownClass感兴趣: https://docs.python.org/3/library/unittest.html#setupclass-and-teardownclass

还要注意单元测试的执行顺序: https://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUsing

无法解决;因此最终使用多个不带test_前缀的函数将其破解:

def test_password_credentials_grant(self):
    for user in self.user_mocks:
        self.register(user)
        self.login(user)
        self.access_token(user, self.assertEqual)  # Ensures access_token is generated+valid
        self.logout(user)
        self.access_token(user, self.assertNotEqual)  # Ensures access_token is now invalid
        self.unregister(user)

正如一些评论所回应的,以这种方式构造测试可能是测试本身的设计缺陷,您应该考虑重新构造它们。但是,如果您想这样做,并且依赖于您正在使用的测试运行程序按字母顺序(看似)执行它们,那么我建议您执行以下操作。

类似于@Matthias所说的,但是我会做一件不同的事情,在这种情况下,你可能会决定在以后继承类。

from unittest import TestCase, main as unittest_main


class TestSimpleFoo(TestCase):
    foo = 'bar'

    def setUp(self):
        pass

    def test_a(self):
        self.assertEqual(self.__class__.foo, 'bar')
        self.__class__.foo = 'can'

    def test_f(self):
        self.assertEqual(self.__class__.foo, 'can')


if __name__ == '__main__':
    unittest_main()

这个答案和您接受的@Matthias的答案的区别在于,类的显式声明与所述类引用的查找。

TestSimpleFoo vs self.__class__

我更喜欢dynamicness,这样我可以在以后继承测试并背靠背地运行这两个测试类,而不会在这两个类之间交叉。因为如果选择从该类继承,显式命名类引用将导致两个测试类针对该引用而不是各自的类运行。

相关问题 更多 >