持续集成 pytest 中有失败用例会导致 Jenkins 的 job 构建失败吗?

醋精测试媛 · 2021年06月09日 · 最后由 王_test 回复于 2021年06月25日 · 5901 次阅读

当 pytest 中有失败用例,那么 Jenkins 会构建失败,下面的 log 如下:

=========================== short test summary info ===========================
FAILED test_h.py::test_hi - assert 1 == 4
======================== 1 failed, 1 warning in 0.34s =========================
Post stage
[Pipeline] allure
[pipeline] $ F:\allure2-master\allure-2.13.9\bin\allure.bat generate -c -o C:\Users\user\.jenkins\workspace\pipeline\allure-report
allure-results does not exist
Report successfully generated to C:\Users\user\.jenkins\workspace\pipeline\allure-report
Allure report was successfully generated.
Creating artifact for the build.
Artifact was added to the build.
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

看不出原因啊,然后把 pytest 中用例改为必定会成功的用例,则 Jenkins 会构建成功。

开始猜测:难道 pytest+allure+jenkisn 必须执行的用例是成功用例才行?可是我记得 Jenkins 构建成不成功应该不取决于测试用例本身的,这是怎么回事呢?

更新一下 pipeline:

pipeline {
    agent any
    environment{
        HHH = "lalalala"
    }
    stages {
        stage('Hello') {
            steps {
                 bat '''cd C:\\Users\\user\\PycharmProjects\\smarthome
pytest -m aaa --alluredir="./outputs/reports" --clean-alluredir --cache-clear
if exist ".pytest_cache/v/cache/lastfailed" (
    pytest -m aaa --lf --alluredir="./outputs/reports"
) else (
    echo "xxx"
)'''
            }
            post{
                always{
                    allure jdk: 'JDK', results: [[path: "./outputs/reports"]]
                }
                success{
                    emailext attachLog: true, attachmentsPattern: 'allure-report/index.html', body: '''<html>
<head>
<meta charset="UTF-8">
<title>${PROJECT_NAME}-第${BUILD_NUMBER}次构建日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>(本邮件是程序自动下发的,请勿回复!)</td>
        </tr>
        <tr>
            <td><h2>
                    <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
                </h2></td>
        </tr>
        <tr>
            <td><br />
            <b><font color="#0B610B">构建信息</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>项目名称 : ${PROJECT_NAME}</li>
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
                    <li>触发原因: ${CAUSE}</li>
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">Changes Since Last
                        Successful Build:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>历史变更记录 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
                </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">构建日志 :</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td><textarea cols="80" rows="30" readonly="readonly"
                    style="font-family: Courier New">${BUILD_LOG,maxLines=10000}</textarea>
            </td>
        </tr>
    </table>
</body>
</html>''', recipientProviders: [buildUser()], subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!', to: 'lishengjiao_13@163.com'
                }
            }
        }
    }
}

共收到 27 条回复 时间 点赞

看了下我的构建情况,也存在类似的问题,应该是 Allure Report 插件引起的。
我想的解决办法:
1、在 Allure Report 步骤后,增加一个构建步骤,保证成功;
2、参考这篇回答中的办法:https://stackoverflow.com/questions/47221524/build-step-allure-report-changed-build-result-to-unstable

ERROR: script returned exit code 1

用例执行失败,退出程序时,返回的 code 1,只有返回值为 0 的情况下, jenkins 才会认定构建成功;

醋精测试媛 关闭了讨论 06月10日 09:19
醋精测试媛 重新开启了讨论 06月10日 09:19
幺叁叁 回复

用例执行中存在失败,退出程序时,pycharm 中是返回 0 的

tester 回复

1.我觉得不是 allure report 的原因,在 stage 中,我删掉整个 post,结果仍然如上所示,因此,与发邮件和 allure 报告都没关系
2.我已经清理掉啦 --clean-alluredir。

pycharm 应该是捕获异常然后返回 0 了, jenkins 不会对对脚本做异常处理,可以用用 shell 的异常处理,让 pytes 执行完不论是否有失败的用例都 exit 0

幺叁叁 回复

还有种方式就是把执行脚本放在一个 shell 脚本文件中,在文件末尾exit 0

bat '''cd C:\\Users\\user\\PycharmProjects\\smarthome
pytest -m aaa --alluredir="./outputs/reports" --clean-alluredir --cache-clear
if exist ".pytest_cache/v/cache/lastfailed" (
    pytest -m aaa --lf --alluredir="./outputs/reports"
) else (
    echo "xxx"
)
exit 0
'''

谢谢大家~已解决~ @shieber @zhongxin94

醋精测试媛 关闭了讨论 06月10日 11:33
mt ios+appium 自动化中遇到的问题 (求助问题 2 中提及了此贴 06月10日 14:30
醋精测试媛 重新开启了讨论 06月10日 16:18
幺叁叁 回复

确实是可行的,但是我现在发现,如果 Pipeline 中含有失败的测试,将会被标注为 UNSTABLE, 标记为黄色。

如果没有,才是 success。

你看下控制台的日志有句
Build step 'Allure Report' changed build result to UNSTABLE
应该是 allure 插件在生成测试报告的时候,发现有失败的用例,然后把构建状态置为 UNSTABLE

幺叁叁 回复

日志如下:

请问有什么解决办法吗?

@Faerie1999 以后问题解决了,把解决方法发出来再关帖,可以吗?

@Lihuazhang @chenhengjie123 希望社区同学都照这条做吧,人人为我,我为人人。

我的问题跟你的还不太一样
我这边是直接用的 gitlab 的 ci/cd,没有使用 Jenkins,在代码库编辑 .gitlab-ci.yml 文件,去执行 script,所以,这个 exit 0,怎么加呢

我那个是我 allure 的配置问题, 我刚创建了流水线,没配置发送邮件,执行完是success

pipeline {
    agent any
    environment{
        HHH = "lalalala"
    }
    stages {
        stage('Hello') {
            steps {
                 sh '''cd /var/lib/jenkins/workspace/API_test
                 bash -x run.sh
                 '''
            }
            post{
                always{
                    allure jdk: 'JDK', results: [[path: "./allure-results"]]
                }
                success{
                echo "1234"
                }
            }
        }
    }
}
mt 回复

你在 script 的末尾加 exit 0 试试,gitlab 的 ci/cd 我没用过😂

Thirty-Thirty 回复

哦,看到你艾特了两个人,只是不太方便知道楼层

Thirty-Thirty 回复

本来解决的方法就在上面了呀。所以我专门艾特了下。

pycharm 应该是捕获异常然后返回 0 了, jenkins 不会对对脚本做异常处理,可以用用 shell 的异常处理,让 pytes 执行完不论是否有失败的用例都 exit 0

还有种方式就是把执行脚本放在一个 shell 脚本文件中,在文件末尾 exit 0

bat '''cd C:\\Users\\user\\PycharmProjects\\smarthome
pytest -m aaa --alluredir="./outputs/reports" --clean-alluredir --cache-clear
if exist ".pytest_cache/v/cache/lastfailed" (
    pytest -m aaa --lf --alluredir="./outputs/reports"
) else (
    echo "xxx"
)
exit 0
'''

你可以先看完整个帖子,我是当时觉得可以结束了的,因为两位大佬都讲得很清楚了。

幺叁叁 回复

你可以 success ,应该是因为 allure 报告没有生成成功,可以看到里面有一句 allure-results does not exist 的报错信息,当你解决完这个问题,就会 unstable 了。(我之前的历程是这样的)

不好意思呵呵,我直接往问题答案楼层翻呢,结果看到结帖了,当时不知道你艾特人就是为了公布答案,我一般会说类似 “感谢 8 楼,问题解决” 这样的话,以便别人迅速找到问题解决办法。

嗯嗯,的确是这样, 昨天调整完 allure 的配置之后,就和你一样的了,有失败的用例就 unstable 了,尝试在 allure 后面执行exit 0, 不过没有效果;感觉要从插件代码入手,或者 pipeline 有什么函数可以改变构建状态的了;
不过这个应该不影响吧?

幺叁叁 回复

基本上不影响,如果没有办法改的话应该只能这样了。

幺叁叁 回复

解决了,gitlab-ci.yml 里面的 job 里面,加上 when: always,就可以了,无论成功失败,后面的都会继续执行

Thirty-Thirty 回复

我加到问答区顶部说明提醒了:

陈恒捷 回复

误会小姐姐,缘起之前有篇问答帖,众人献计献策后,楼主只说了句 “问题解决了”,也没说用的哪个方法解决的,我赶紧跟了句 “怎么解决的?我这边也遇到了类似的问题”(其实没遇到),他回复说明了解决方法。
顶部加个提醒挺好的,呵呵!

其实是有点问题的,比如本来可以设置任何人为最佳回复,现在只能设置自己回复他人的那一条为最佳恢复了。

还有就是附言功能确认之后会出现 “访问被拒绝,你可能没有权限或未登录。” 但是实际上只是附言自己的帖子,这样比较会妨碍大家方便的贴上解决方案。
@chenhengjie123

这是个 bug,我周末查下啥原因,修复下

如果是 httprunner,怎么实现用例执行失败,构建失败啊, 目前都是构建成功
想到怎么获取 httprunner 的执行通过率,或者生成 junitxml 格式

33楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册