首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包含基类和子类的Python单元测试

包含基类和子类的Python单元测试
EN

Stack Overflow用户
提问于 2009-08-24 16:39:42
回答 15查看 69.3K关注 0票数 172

我目前有几个单元测试,它们共享一组通用的测试。下面是一个例子:

代码语言:javascript
复制
import unittest

class BaseTest(unittest.TestCase):

    def testCommon(self):
        print 'Calling BaseTest:testCommon'
        value = 5
        self.assertEquals(value, 5)

class SubTest1(BaseTest):

    def testSub1(self):
        print 'Calling SubTest1:testSub1'
        sub = 3
        self.assertEquals(sub, 3)


class SubTest2(BaseTest):

    def testSub2(self):
        print 'Calling SubTest2:testSub2'
        sub = 4
        self.assertEquals(sub, 4)

if __name__ == '__main__':
    unittest.main()

上面的输出是:

代码语言:javascript
复制
Calling BaseTest:testCommon
.Calling BaseTest:testCommon
.Calling SubTest1:testSub1
.Calling BaseTest:testCommon
.Calling SubTest2:testSub2
.
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK

有没有办法重写上面的代码,这样第一个testCommon就不会被调用?

编辑:而不是运行上面的5个测试,我希望它只运行4个测试,2个来自SubTest1,另外2个来自SubTest2。看起来Python unittest正在独立运行原始的BaseTest,我需要一种机制来防止这种情况发生。

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2009-08-24 17:00:01

使用多重继承,这样具有公共测试的类本身就不会从TestCase继承。

代码语言:javascript
复制
import unittest

class CommonTests(object):
    def testCommon(self):
        print 'Calling BaseTest:testCommon'
        value = 5
        self.assertEquals(value, 5)

class SubTest1(unittest.TestCase, CommonTests):

    def testSub1(self):
        print 'Calling SubTest1:testSub1'
        sub = 3
        self.assertEquals(sub, 3)


class SubTest2(unittest.TestCase, CommonTests):

    def testSub2(self):
        print 'Calling SubTest2:testSub2'
        sub = 4
        self.assertEquals(sub, 4)

if __name__ == '__main__':
    unittest.main()
票数 165
EN

Stack Overflow用户

发布于 2014-09-06 07:58:25

不要使用多重继承,它会咬你的later

相反,您可以将基类移动到单独的模块中,或者用空白类包装它:

代码语言:javascript
复制
class BaseTestCases:

    class BaseTest(unittest.TestCase):

        def testCommon(self):
            print('Calling BaseTest:testCommon')
            value = 5
            self.assertEqual(value, 5)


class SubTest1(BaseTestCases.BaseTest):

    def testSub1(self):
        print('Calling SubTest1:testSub1')
        sub = 3
        self.assertEqual(sub, 3)


class SubTest2(BaseTestCases.BaseTest):

    def testSub2(self):
        print('Calling SubTest2:testSub2')
        sub = 4
        self.assertEqual(sub, 4)

if __name__ == '__main__':
    unittest.main()

输出:

代码语言:javascript
复制
Calling BaseTest:testCommon
.Calling SubTest1:testSub1
.Calling BaseTest:testCommon
.Calling SubTest2:testSub2
.
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK
票数 174
EN

Stack Overflow用户

发布于 2014-04-03 19:20:32

只需一条命令即可解决此问题:

代码语言:javascript
复制
del(BaseTest)

因此,代码将如下所示:

代码语言:javascript
复制
import unittest

class BaseTest(unittest.TestCase):

    def testCommon(self):
        print 'Calling BaseTest:testCommon'
        value = 5
        self.assertEquals(value, 5)

class SubTest1(BaseTest):

    def testSub1(self):
        print 'Calling SubTest1:testSub1'
        sub = 3
        self.assertEquals(sub, 3)


class SubTest2(BaseTest):

    def testSub2(self):
        print 'Calling SubTest2:testSub2'
        sub = 4
        self.assertEquals(sub, 4)

del(BaseTest)

if __name__ == '__main__':
    unittest.main()
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1323455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档