首页 > 解决方案 > 是否可以在 pyunitest 中实现多个测试运行器?只运行一次测试套件

问题描述

if __name__ == '__main__':
    if is_running_under_teamcity():
        runner = TeamcityTestRunner()
    else:
        runner =  HTMLTestRunner.HTMLTestRunner(
                stream=outfile,
                title='Test Report',
                description='This is an example.'
                )
    unittest.main(testRunner=runner)

我目前正在 python 中使用 unittest 模块运行一些测试,这是我上面的当前代码。我正在 Teamcity 上部署此测试设置,第一个模块允许我将输出转换为 teamcity-messages,第二个模块创建结果的 html 报告。有没有一种方法可以在只运行一组测试的同时运行这两个跑步者?我在小步舞曲中看到的唯一选择是尝试将这两个模块组合成一个混合模块,或者使用 Teamcity 支持的另一个测试模块。但是我想保持尽可能低的依赖关系

任何想法都会很棒:)

标签: pythonpython-3.xteamcitypython-unittestrunner

解决方案


任何想法都会很棒:)

看起来你必须手动处理它,查看代码 TeamcityTestRunner 是标准 TextTestRunner 的一个非常简单的扩展,但是 HTMLTestRunner 是一种更复杂的野兽。

可悲的是,这是标准库的一个领域,它的架构非常糟糕:人们可以期望测试运行器只关心发现和运行测试,但是它也负责部分测试报告,而不是拥有一个完全独立的测试报告器(这个此外,测试报告是与测试结果分开的责任,这也不应该是该人的工作描述的一部分)。

坦率地说,如果您没有任何进一步的自定义,我建议您只使用pytest作为您的测试运行程序,而不是使用自定义运行程序进行单元测试:

  • 它应该能够很好地运行单元测试
  • IME 它具有更好的关注点分离和可插拔性,因此拥有多个报告器/格式化程序应该开箱即用
    • pytest-html 在不影响正常文本输出的情况下生成报告当然没有问题
    • 根据自述文件 teamcity 自动启用并用于 pytest
    • 所以我假设在你的 teamcity 构建期间生成 html 报告可以正常工作(测试)
  • 并且您最终可以迁移到使用 pytest 测试(这要好得多,甚至都不好笑)

推荐阅读