在多个 python 版本中运行 pytest 时,如何阻止 Tox 覆盖 junit.xml 文件和测试名称?

问题描述

在我的 CI/CD 管道中,测试处理步骤查找 junit xml 文件并报告结果。我正在使用 Tox 为 python 版本 3.6、3.7、3.8 和 3.9 运行 pytest。

最初,Tox 将 3.6 生成的 junit.xml 替换为 3.7 中的 junit.xml,将 3.7 替换为 3.8 等,但通过传递 --junitxml="junit-{envname}.xml" 并更新 CI/CD 配置以查找 {{1} } 我能够保留每个环境的结果。

然而,测试结果是按测试模块和名称报告的,并且由于在每个 tox 环境中运行相同的测试,结果仍然显示后面的环境结果覆盖了前面的结果。

我曾尝试添加 junit-*.xml,但变量替换在这里的工作方式不同,而且我的 junit 套件名称现在对于所有环境都是 junit_suite_name = "project-{envname}"。我的目标是以某种方式在测试名称加上“py36”、“py37”等前缀,这样测试名称就会不同。

以防万一,我将 Bamboo 用于 CI/CD。

解决方法

正如上述评论中的@gold_cy,我能够使用 record-xml-attribute 来解决这个问题。

import sys
_ver = f"{sys.version_info[0]}_{sys.version_info[1]}"

def test_graph(record_xml_attribute):
    record_xml_attribute("classname",f"test_class_{_ver}")
    ...

似乎对我有用。 3_63_7 等现在已为我添加到类名中。