我需要测试两个参数的组合,每个参数只有几个可能性。所以我希望有一个类层次结构,其中每个子类都有自己的固定参数A,而参数B可以基于该公共A进行测试。我想根据参数A的变化对测试用例中的测试方法进行多态化,所以我不必为我测试的每个子类重写测试方法,但是仍然可以在子类的测试中有变化。
然而,我发现如果我在setUp(self)中声明属性。属性self.A
不会被子类化。这意味着我的所有子类都具有相同的self.A值来自第一个测试用例(父类)。我的所有testSomething(self)
方法都不是虚拟的!含义如下:
class baseTest(unittest.TestCase):
def setUp(self):
print('base setup')
self.A = 100
def testSomething(self):
print('base test')
# Do something with self.A
class subTest(baseTest):
def setUp(self):
print('sub setup')
self.A = 999
def testSomething(self):
print('sub test')
# Do something with self.A
编辑:我将这两个类放在一个文件中,并依赖于if __name__ == "__main__"
运行此文件会给我:
base setup
base test
base setup
base test
我认为所有python方法都是虚拟的,但在unittest中似乎并非如此。
我该怎么办?
答案 0 :(得分:2)
<强>更新强>
我在下面实施了该计划,它按预期工作。 见下文:
class baseTest(unittest.TestCase):
def setUp(self):
print('base setup')
self.A = 100
def testSomething(self):
print('base test')
self._DoTestSomething(self)
def _DoTestSomething(self)
# Do something with self.A
class subTest(baseTest):
def setUp(self):
print('sub setup')
self.A = 999
def _DoTestSomething(self)
# Do something with self.A
<强> OLD 强>
好的,我现在有个计划。 我可以在非testSomething()方法中编写测试实现,这些方法应该是虚拟的,然后将testSomething()委托给这些虚拟方法。
我没有测试过这个想法,但我认为它应该有用。
答案 1 :(得分:2)
不确定你遇到了什么,但对我来说效果很好......?
使用您的代码,然后添加:
a = baseTest()
b = subTest()
a.setUp()
a.testSomething()
b.setUp()
b.testSomething()
这是我的输出:
base setup
base test
sub setup
sub test
答案 2 :(得分:0)
testscenarios
library旨在采用您编写的测试方法和一些数据方案,为每种组合(测试方法×场景)生成单独的测试用例。
例如:
import unittest
import testscenarios
from .. import system_under_test
class foo_TestCase(testscenarios.WithScenarios, unittest.TestCase):
""" Test cases for `foo` function. """
scenarios = [
('purple': {
'wibble': "purple",
'expected_count': 2,
'expected_output': "Purple",
}),
('orange': {
'wibble': "orange",
'expected_count': 3,
'expected_output': "Orange",
}),
('red': {
'wibble': "red",
'expected_count': 1,
'expected_output': "Red",
}),
]
def test_has_expected_vowel_count(self):
""" Should give the expected count of vowels. """
vowel_count = system_under_test.foo(self.wibble)
self.assertEqual(self.expected_count, vowel_count)
def test_sets_expected_output(self):
""" Should set the output to the expected value. """
system_under_test.foo(self.wibble)
self.assertEqual(self.expected_output, system_under_test.output)
当{1}}类发生测试发现时,将为测试运行器生成6个测试。它们将使用方案名称注释名称,因此生成的测试报告会区分每个特定的测试用例:
foo_TestCase
如果您需要,可以获得更大的灵活性 - 请参阅foo_TestCase.test_has_expected_vowel_count (purple)
foo_TestCase.test_has_expected_vowel_count (orange)
foo_TestCase.test_has_expected_vowel_count (red)
foo_TestCase.test_sets_expected_output (purple)
foo_TestCase.test_sets_expected_output (orange)
foo_TestCase.test_sets_expected_output (red)
文档 - 但上面演示了我大部分时间都在使用它的方式。