运行自动发现的Python单元测试的子集
简短问题
在使用Python的unittest模块进行自动发现时,是否可以在运行时选择要运行的单元测试?
背景
我正在使用unittest模块对一个外部系统进行系统测试。下面是一个示例的sudo测试用例。unittest模块让我可以创建任意数量的测试用例,并通过unittest的测试运行器来运行它们。我已经使用这种方法大约六个月了,效果非常好。
现在,我想让这个过程更通用、更友好。目前我运行的所有测试套件中,我都硬编码了每个系统必须运行的测试。这对于一个未经过测试的系统来说没问题,但如果某个测试错误地失败(比如用户连接到了错误的测试点等),他们就必须重新运行整个测试套件。有些完整的测试套件可能需要长达20分钟,这显然不太理想。
我知道可以创建自定义的测试套件构建器来定义要运行的测试。但我的问题是,有成百上千的测试用例,如果测试用例的名称发生变化,维护起来会变得非常麻烦。
我希望能使用nose或内置的unittest模块来实现这个目标。对于这两种选择,发现测试用例的部分似乎都很简单,但我的问题是,选择要运行的测试用例的唯一方法是定义测试用例名称中存在的模式。这意味着我仍然需要硬编码一个模式列表来定义要运行的测试用例。那么,如果我必须硬编码这个列表,使用自动发现的意义何在呢?(请注意,这只是个反问)
我的最终目标是有一种通用的方法,在执行过程中选择要运行的单元测试,形式可以是复选框或用户可以编辑的文本框。理想情况下,这个解决方案需要使用Python 2.7,并且能够在Windows、OSX和Linux上运行。
编辑
为了更清楚,我不希望这个工具生成选择列表或复选框。这个工具理想情况下应该返回一个目录中所有测试的列表,包括完整路径和测试用例所属的测试套件(如果有的话)。有了这个列表,我可以构建复选框或下拉框供用户交互,并动态地将这些测试传入测试套件中运行。
示例测试用例
test_measure_5v_reference
1) Connect to DC power supply via GPIB
2) Set DC voltage to 12.0 V
3) Connect to a Digital Multimeter via GPIB
4) Measure / Record the voltage at a given 5V reference test point
5) Use unittest's assert functions to make sure the value is within tolerance
1 个回答
把每一组测试放在自己的模块里。让用户通过复选框或者文本输入来选择模块,这样你就能得到一个模块名称的列表。一旦你有了这些模块名称,就可以根据这些名称创建一个相应的测试套件,做法大概是这样的。
testsuite = unittest.TestSuite()
for module in modules:
testsuite.addTest(unittest.defaultTestLoader.loadTestsFromModule(module))