你可以改变python unittest测试用例吗?

时间:2014-01-21 21:47:03

标签: python unit-testing python-unittest

我需要测试两个参数的组合,每个参数只有几个可能性。所以我希望有一个类层次结构,其中每个子类都有自己的固定参数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__"

中启动的unittest.main()

运行此文件会给我:

base setup
base test
base setup
base test

我认为所有python方法都是虚拟的,但在unittest中似乎并非如此。

我该怎么办?

3 个答案:

答案 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) 文档 - 但上面演示了我大部分时间都在使用它的方式。