如何让Tox执行已屏蔽失败用例的Pytest时TeamCity构建变绿?
问题描述
我有如下tox.ini配置文件:
[tox] envlist = py310, flake8 isolated_build = True [testenv] skip_install = True deps = -rtest_requirements.txt passenv = * commands = pytest {posargs} --teamcity [testenv:flake8] deps = flake8 skip_install = True commands = flake8 tests/
在TeamCity中,我通过以下shell脚本执行Python测试:
#!/bin/sh python -m tox .
现在有一个已被屏蔽的测试用例失败,但TeamCity仍将构建标记为红色,尽管该测试已被屏蔽。这个问题存在已久,相关工单编号为TW-16784。
我希望修改tox.ini中的命令让构建恢复绿色,但不想给Python测试添加skip标记,也不想用带-的命令形式(这会忽略所有错误,比如测试执行内部错误、未收集到测试用例等)。理想情况是执行pytest {posargs} --teamcity || [ $? = 1 ],但Tox不支持||符号,请问该如何解决?
解决方案
因为Tox的commands字段不直接支持shell逻辑运算符,你可以通过以下两种方式实现需求:
方式一:用shell包裹命令
直接调用shell执行带逻辑判断的命令,把完整逻辑放在sh -c中,注意转义特殊变量避免Tox提前解析:
[testenv] commands = sh -c "pytest {posargs} --teamcity || [ \$? = 1 ]"
这种方式下,只有当pytest返回退出码1(代表测试失败但程序自身正常运行)时,整个命令会返回0,让Tox判定执行成功;如果是其他非0退出码(比如内部错误、未找到测试用例等),会保留原退出码,Tox会标记构建失败。
方式二:使用单独的shell脚本
如果觉得在配置文件里写转义命令不够清晰,可以创建一个独立的脚本文件,比如run_tests.sh:
#!/bin/sh pytest "$@" --teamcity EXIT_CODE=$? # 仅当退出码为1时返回0,其他情况保留原退出码 if [ $EXIT_CODE -eq 1 ]; then exit 0 else exit $EXIT_CODE fi
给脚本添加执行权限:chmod +x run_tests.sh,然后修改tox.ini的命令:
[testenv] commands = ./run_tests.sh {posargs}
这两种方式都能满足你的要求:仅忽略测试失败(退出码1)的情况,保留其他错误的失败提示,同时无需给测试用例添加skip标记。
内容的提问来源于stack exchange,提问作者Laurent Michel
相关产品推荐
相关产品推荐

