Python3UnitTest:是否可以附加新的测试方法?

2024-04-18 05:06:22 发布

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

我使用python3.4.1和unittest模块来验证另一个软件。在

另一个软件需要运行,它的输出必须由python脚本解析以进行验证。输出文件是一个包含未知数量元素的XML文件。在

目前,我一直在使用^{}为每个XML元素生成一个子测试。这不是我想要的。在

我想为XML文件中的每个元素创建一个测试方法。问题是我事先不知道会有多少元素,所以我需要一种方法来自动向unittest添加新的测试方法。我想有一个setUpClass()方法,它将调用外部软件来生成XML并生成要运行的test*方法的更新列表。在

但是我认为这些方法会被添加到unittest的方法列表中,以便在执行任何操作之前运行,因此一旦我到达添加新方法的点(例如从setUpClass()内部使用setattr()),列表已经构建,新方法永远不会运行。。。在

是否可以动态更改要在unittest中运行的方法列表?在

谢谢!在


Tags: 模块文件方法test脚本元素列表数量
2条回答

以下是我想出的一个变体:

import unittest

class MyClass:
    def setup(self):
        # run external software
    def parse_xml(self):
        # parse the xml file
    def generator(self, test_class, a, b):
        def test(self):
            self.assertEqual(a, b)
        return test

    def add_test_methods(self, test_class):
        for i in range(len(self.all_status)):
            test = self.generator(test_class, self.all_status[i], STATUS_SUCCESS)
            setattr(test_class, "test_uid_%d" % i, test)


class TestIO(unittest.TestCase):
    pass

mb = MyClass()
mb.setup()
mb.parse_xml()
mb.add_test_methods(TestIO)

if __name__ == '__main__':
    unittest.main()

{and parse>使用类的任何方法来生成unittest无法捕获错误…)

也许我可以将XML生成转移到它自己的测试类中?在

有更好的建议吗?在

我想到了这个。我试过了@big\u gie提交的代码。这样,setUp和tearDown也将按照单元测试规则运行。。在

import unittest

def generator(test_class, a, b): def test(self): self.assertEqual(a, b) return test

def add_test_methods(test_class): test_list = [[2,3, 'one'], [5,5, 'two'], [0,0, 'three']] for case in test_list: test = generator(test_class, case[0], case[1]) setattr(test_class, "test_%s" % case[2], test)

class TestIO(unittest.TestCase):def setUp(self): print 'Setup' pass

def tearDown(self): print 'TearDown' pass

add_test_methods(TestIO)

if __name__ == '__main__':unittest.main(verbosity=1)

结果:

>>> 
Setup
FTearDown
Setup
TearDown
.Setup
TearDown
.
======================================================================
FAIL: test_one (__main__.TestIO)
                                   
Traceback (most recent call last):
  File "D:/inchowar/Desktop/PyTrash/test_auto_3.py", line 5, in test
    self.assertEqual(a, b)
AssertionError: 2 != 3

                                   
Ran 3 tests in 0.019s

FAILED (failures=1)

相关问题 更多 >