unittest discover - 执行两次的继承测试方法

时间:2017-10-27 15:46:36

标签: python python-unittest

情况1

假设我有一个我想重复使用的测试类,test_doubled.py

import unittest

class BaseTestCase(unittest.TestCase):
    def test_something(self):
        self.assertTrue(True)

它包含一个单独的类BaseTestCase,它继承自unittest.TestCase并且只有一个测试方法。

从命令行运行测试会产生以下预期输出:

$ python -m unittest discover -p test_doubled.py -v
test_something (test_doubled.BaseTestCase) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

情况2

现在假设我添加了第二个模块test_doubled_2.py,如下所示:

from test_doubled import BaseTestCase

class DerivedTestCase(BaseTestCase):
    pass

它继承自BaseTestCase,所以我希望它具有相同的测试方法,并且测试方法将被执行。但是,当我运行它时,我得到以下输出:

$ python -m unittest discover -p test_doubled_2.py -v
test_something (test_doubled.BaseTestCase) ... ok
test_something (test_doubled_2.DerivedTestCase) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

它似乎运行该方法两次,一次用于派生类,一次用于基类。这根本不是我所期望的。

情况3

我怀疑,通过从BaseTestCase导入test_doubled_2.py,整个BaseTestCase课程正在执行。这似乎可以通过运行两个测试模块来确认:

$ python -m unittest discover -p test_doubled\*.py -v
test_something (test_doubled.BaseTestCase) ... ok
test_something (test_doubled.BaseTestCase) ... ok
test_something (test_doubled_2.DerivedTestCase) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

运行两个模块执行相同的测试方法三次,当我希望它只执行两次。

如何让测试方法仅在情境2中执行一次,在情境3中执行两次?

更新

为了澄清,BaseTestCase应该是一个可用的测试,所以将它作为mixin是行不通的。我只想防止它被多次执行。

这是期望的结果:

  1. 仅在BaseTestCase中运行test_doubled.py测试:

    $ python -m unittest discover -p test_doubled.py -v
    test_something (test_doubled.BaseTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    OK
    

    这已经按照需要运作。

  2. 仅在DerivedTestCase中运行test_doubled_2.py

    $ python -m unittest discover -p test_doubled_2.py -v
    test_something (test_doubled_2.DerivedTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    

    它应该只执行DerivedTestCase,而不是 BaseTestCase

  3. 同时运行:

    $ python -m unittest discover -p test_doubled\*.py -v
    test_something (test_doubled.BaseTestCase) ... ok
    test_something (test_doubled_2.DerivedTestCase) ... ok
    
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    OK
    

    测试方法执行两次,一次针对BaseTestcase,一次针对DerivedTestCase

2 个答案:

答案 0 :(得分:2)

你可以像这样使用mixin:

# mixin.py
class TestMixin(object):

    def test_something(self):
        self.assertTrue(True)


# test_base.py
import unittest
from .mixin import TestMixin

class BaseTestCase(TestMixin, unittest.TestCase):

    pass


# test_derived.py
import unittest
from .mixin import TestMixin

class DerivedTestCase(TestMixin, unittest.TestCase):

    pass

答案 1 :(得分:0)

不要使用多重继承,以后会咬你。

使用https://stackoverflow.com/a/25695512/328384

中建议的包装方法