You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:41:03