你能变形python的unittest测试用例吗?

2024-09-20 22:53:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要测试两个参数的组合,每个参数只有几个可能性。所以我想有一个类层次结构,每个子类都有自己固定的参数a,而参数B可以基于这个公共的a进行测试。我想在测试用例中根据一个移位的参数a来改变测试方法,这样我就不必为我测试的每个子类重写测试方法,但是在子类的测试中仍然可以有变化。在

但是,我发现如果我在setUp(self)中声明属性。属性self.A没有子类化。这意味着我所有的子类都有相同的self。来自第一个测试用例(父类)的值。而且我所有的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

编辑:我将两个类放在一个文件中,并依赖unittest.main()发布于if __name__ == "__main__"

运行这个文件可以让我:

^{pr2}$

我原以为所有python方法都是虚拟的,但在unittest中似乎不是这样。在

我该怎么办?在


Tags: 方法selfbase参数属性层次结构defsetup
3条回答

不知道你遇到了什么,但对我来说很好。。。?在

使用您的代码,然后添加以下内容:

a = baseTest()
b = subTest()

a.setUp()
a.testSomething()
b.setUp()
b.testSomething()

以下是我的输出:

^{pr2}$

更新

我实施了下面的计划,并按预期工作。 见下文:

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

旧的

好吧,我现在有个计划了。 我可以用非testSomething()方法编写测试实现,这些方法应该是虚拟的,然后将testSomething()委托给这些虚拟方法。在

我还没试过这个主意,但我觉得应该行得通。在

^{} library被设计为采用您编写的测试方法和一些数据场景,为(test method×scenario)的每个组合生成单独的测试用例。在

例如:

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)

当测试发现发生时,foo_TestCase类将为测试运行程序生成6个测试。它们的名称将用方案名称注释,因此生成的测试报告区分每个特定的测试用例:

^{pr2}$

如果您需要的话,可以使用更多的灵活性—请参阅testscenarios文档—但是上面的内容演示了我在大多数情况下是如何使用它的。在

相关问题 更多 >

    热门问题