如何将pytest的SETUP和TEARDOWN日志写入JUnit XML文件?
当前Jenkins流水线执行的pytest命令:
pytest -o log_cli=true --durations=20 --full-trace -rPA --setup-show --show-capture=all --capture=tee-sys -x -vv --junitxml='afile.xml' tests/<secret> --assert-commit-sha '${GIT_COMMIT}' --environment '${TEST_ENV_NAME}'
pytest.ini配置内容:
[pytest] log_cli=true log_cli_level=warning log_format = %(asctime)s.%(msecs)03d %(levelname)s %(message)s log_date_format = %Y-%m-%d %H:%M:%S # The initial try ; junit_logging=all junit_logging=system-out junit_log_passing_tests = True ; junit_family=xunit2
测试过程中std::cout能输出SETUP和TEARDOWN相关内容,但这些信息并未写入生成的JUnit XML文件。已知--setup-show参数可在终端显示这些内容,需要将其记录到JUnit XML中。
解决步骤
1. 修改JUnit日志捕获范围
将pytest.ini中的junit_logging=system-out改为junit_logging=all,该配置会让JUnit插件捕获测试过程中所有类型的日志输出(包括setup/teardown相关内容),并写入XML文件。
修改后的pytest.ini相关配置段:
[pytest] # 保留原有其他配置 junit_logging=all junit_log_passing_tests = True
2. 确认输出捕获参数有效性
命令行中已使用--capture=tee-sys,该参数会将输出同时发送到终端和pytest的捕获缓冲区,确保setup/teardown的输出能被JUnit插件识别,无需修改此参数,只需确认它存在于命令中。
3. 调整日志级别以捕获--setup-show输出
--setup-show的输出属于pytest的INFO级别日志,当前pytest.ini中log_cli_level=warning仅捕获WARNING及以上级别日志,需调整全局日志级别确保INFO级别的setup/teardown日志被捕获:
在pytest.ini中添加或修改:
[pytest] # 保留原有其他配置 log_level=info
或者直接在命令行中追加参数:-o log_level=info,确保pytest将INFO级别的日志纳入捕获范围,进而被JUnit插件写入XML。
4. 验证XML输出
生成的afile.xml中,每个测试用例的<system-out>或<system-err>标签下应包含对应的setup/teardown输出;模块或类级别的setup/teardown内容会关联到对应的测试集合节点中。
内容的提问来源于stack exchange,提问作者robotsfoundme

