Python3单元测试:是否可以附加新的测试方法?

Python3单元测试:是否可以附加新的测试方法?,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我正在使用Python3.4.1和unittest模块来验证另一个软件 另一个软件需要运行,其输出必须由python脚本解析以进行验证。输出文件是包含未知数量元素的XML文件 目前,我一直在使用生成每个XML元素的一个子测试。这不是我想要的 我想为XML文件中的每个元素创建一个测试方法。问题是我事先不知道会有多少元素,所以我需要一种方法来自动向unittest添加新的测试方法。我认为有一个setUpClass()方法可以调用外部软件来生成XML,并构建要运行的test*方法的更新列表 但是我认为

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

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

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

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

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

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


谢谢

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

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()
诀窍是在任何类之外生成和解析XML文件,并使用
setatt()
将结果方法添加到类中。这种方法的问题是,它在测试套件之外运行代码,我不希望这样做。因此,那里的故障将破坏整个套件(因为
unittest
不会捕获错误…)

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


有更好的建议吗?

我想到了这个。我尝试了@big_gie提交的代码。这样,安装和拆卸也将按照单元测试规则运行

导入单元测试

def发生器(测试等级a、b):
def测试(自我):
自我评估资格(a、b)
返回测试

def添加测试方法(测试类):
测试列表=[[2,3,[1'],[5,5,[2'],[0,0,[3']]
对于测试列表中的案例:
测试=生成器(测试类,案例[0],案例[1])
setattr(测试类,“测试%s”%case[2],test)

class TestIO(unittest.TestCase):
def设置(自):
打印“设置”
通过

def拆卸(自): 打印“拆卸” 通过

添加测试方法(TestIO)

如果
unittest.main(详细度=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)

您可以使用
py.test
执行此操作。然而,到底是什么让
子测试成为问题?它似乎做了你想做的事?
子测试
很接近,但不完全如此;每个元素实际上都是软件的单元测试结果。我想在两个方面都匹配测试,而不是从软件匹配到python中的单个测试。。。