简短问题
是否可以在运行时选择在Python的unittest模块中使用自动发现方法时要运行的单元测试。
背景
我使用unittest模块在外部系统上运行系统测试。请参阅下面的示例sudo-testcase。 unittest模块允许我创建一个可以使用unittest的testrunner运行的任意数量的测试用例。我一直在使用这种方法大约6个月的持续使用,它正在非常。
此时我想尝试使其更通用且用户友好。对于我现在运行的所有测试套件,我已经硬编码了每个系统必须运行的测试。这对于未经测试的系统来说很好,但是当测试失败时(用户连接到错误的测试点等等),他们必须重新运行整个测试套件。由于一些完整的套房可能需要20分钟,这不是理想的选择。
我知道可以创建自定义 testsuite构建器,可以定义要运行的测试。我的问题是,有数百个测试用例可以运行和维护,如果测试用例名称改变等,这将成为一场噩梦...
我希望使用nose或内置的unittest模块来实现这一目标。对于这两个选项,发现部分看起来非常简单,但我的问题是,选择要运行的测试用例子集的唯一方法是定义测试用例名称中存在的模式。这意味着我仍然需要硬编码模式列表来定义要运行的测试用例。因此,如果我必须对此列表进行硬编码,那么使用自动发现有什么意义(请注意这是修辞问题)?
我的最终目标是使用通用方法选择在执行期间运行的单元测试,以复选框的形式或用户可以编辑的文本字段。理想情况下,解决方案将使用Python 2.7,并且需要在Windows,OSX和Linux上运行。
修改
为了帮助澄清,我不希望该工具生成选项列表或复选框。理想情况下,该工具将返回目录中所有测试的列表,包括完整路径以及测试用例属于哪个Suite(如果有)。使用此列表,我将构建用户与之交互的复选框或组合框,并将这些测试即时传递给测试套件。
示例测试用例
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
答案 0 :(得分:1)
将每个测试子集存储在自己的模块中。通过让用户使用复选框或文本输入选择它们来获取模块名称列表。获得模块名称列表后,您可以构建相应的测试套件,执行与以下类似的操作。
testsuite = unittest.TestSuite()
for module in modules:
testsuite.addTest(unittest.defaultTestLoader.loadTestsFromModule(module))