情况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是行不通的。我只想防止它被多次执行。
这是期望的结果:
仅在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
这已经按照需要运作。
仅在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
。
同时运行:
$ 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
。
答案 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)
不要使用多重继承,以后会咬你。
中建议的包装方法