当pytest测试失败时,如何不将Jenkins作业标记为失败

当pytest测试失败时,如何不将Jenkins作业标记为失败,jenkins,pytest,Jenkins,Pytest,我有一个Jenkins设置,其中有一个管道,使用pytest运行一些测试套件。有时测试失败,有时测试环境崩溃(随机HTTP超时、外部库错误等)。作业解析XML测试结果,但只要pytest返回非零,构建就会被标记为失败 我希望Jenkins从pytest中获得退出代码零,即使有失败的测试,但我也希望其他错误被标记为失败。是否有任何pytest选项可以解决此问题?我找到了pytest-custom_exit_代码,但它只能抑制空测试套件错误。也许是一些詹金斯选项或bash片段 我的groovy管道的

我有一个Jenkins设置,其中有一个管道,使用pytest运行一些测试套件。有时测试失败,有时测试环境崩溃(随机HTTP超时、外部库错误等)。作业解析XML测试结果,但只要pytest返回非零,构建就会被标记为失败

我希望Jenkins从pytest中获得退出代码零,即使有失败的测试,但我也希望其他错误被标记为失败。是否有任何pytest选项可以解决此问题?我找到了pytest-custom_exit_代码,但它只能抑制空测试套件错误。也许是一些詹金斯选项或bash片段

我的groovy管道的简化版本:

pipeline {
    stages {
        stage ('Building application') {
            steps {
                sh "./build.sh"
            }
        }
        stage ('Testing application') {
            steps {
                print('Running pytest')
                sh "cd tests && python -m pytest"
            }
            post {
                always {
                    archiveArtifacts artifacts: 'tests/output/'
                    junit 'tests/output/report.xml'
                }
            }
        }
    }
}
我试图捕获退出代码1(意思是),但Jenkins仍然收到退出代码1,并将构建标记为失败:

sh "cd tests && (python -m pytest; rc=\$?; if [ \$rc -eq 1 ]; then exit 0; else exit \$rc; fi)"

我的解决方案是在中实现支持,并创建一个pull请求


从插件的0.3.0版开始,我可以使用
pytest--suppress tests failed exit code
来获得所需的行为。

您的尝试无效,因为Jenkins在运行shell时启用了errexit(-e)选项,这会导致shell在pytest命令之后立即退出,然后再到达if语句。但是,有一个单行程序可以工作,因为它作为一条语句执行:

因此,您的构建步骤如下所示:

sh'cd-tests&&python-m-pytest | |[[$?-eq 1]]

您能阻止任何代码吗?可以将结果设置为不稳定,但是如何设置当然取决于您的实现。是否要获取退出代码,如果与零不同,则标记为不稳定?据我所知,默认的Jenkins行为是,如果测试结果不成功,则将生成标记为不稳定,如果生成未能生成测试结果,则将生成标记为失败。我想这样做是为了能够判断这是一个测试失败还是一个环境错误。我的问题是这项工作被标记为失败。为了更好地描述这个问题,我更改了标题。很好,这似乎是最干净的解决方案。