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

时间:2019-08-05 12:22:41

标签: jenkins pytest

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

即使测试失败,我也希望詹金斯从pytest获取退出代码零,但我也希望将其他错误标记为失败。是否有任何pytest选项可以解决此问题?我发现pytest-custom_exit_code,但是它只能抑制空测试套件错误。也许一些詹金斯选项或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(表示some tests failed),但詹金斯仍然收到退出代码1,并将构建标记为FAILURE:

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

2 个答案:

答案 0 :(得分:1)

我的解决方案是在pytest-custom-exit-code中自己实现支持并创建请求请求。

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

答案 1 :(得分:1)

您的尝试不起作用,因为Jenkins在启用errexit(-e)选项的情况下运行外壳程序,这会导致外壳程序在pytest命令之后立即退出,直到到达if语句。但是有一种方法可以工作,因为它作为一条语句执行:https://stackoverflow.com/a/31114992/1070890

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

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