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

时间:2014-01-30 04:19:26

标签: python unit-testing persistence testcase python-unittest

如何在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()

即:我希望上面的两个测试通过

4 个答案:

答案 0 :(得分:43)

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

与@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__

我更喜欢动态性,所以我可以在以后继承测试并连续运行两个测试类,并且两者之间没有任何交叉。因为如果您选择从此类继承,则显式命名类引用将导致两个测试类针对该引用而不是它们各自的类运行。

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:1)

无法理解;所以最终用多个非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)

答案 3 :(得分:0)

除了别人所说的那样,不应以这种方式实现测试方法之间的数据共享,建议使用setup()。

测试方法本身应隔离。