繁体   English   中英

当 pytest 测试失败时,Jenkins 作业失败

[英]Jenkins Job fails when pytest test fails

只是想探索 pytest 并将其集成到 Jenkins 中。 我的示例 pytest 测试用例是

def a(x):
    return x+1

def test_answer():
    assert a(2) == 3

def test_answer2():
    assert a(0) == 2

然后我生成了一个独立的 pytest 脚本,我在 Jenkins 中运行该脚本,生成一个要解析的 xml 以获取结果。

由于 test_answer2 失败,Jenkins 作业也失败。 我假设这是因为返回的退出代码非零。 我将如何解决这个问题,即即使 1 个或多个测试确实失败,Jenkins 的工作也不会。 谢谢

如果要在批处理文件或shell脚本中调用此测试执行,或者直接在Jenkins中使用命令执行。 您可以按照以下方式:

Windows:

<your test execution calls>

exit 0

Linux:

set +e

<your test execution calls>

set -e

如果在批处理脚本中调用它并且Jenkins将状态显示为成功,则将忽略该错误。

如果要在批处理文件或shell脚本中调用此测试执行,或者直接在Jenkins中使用命令执行。 您可以按照以下方式:下面的代码不起作用

Linux的:

set +e

set -e

除了已经发布的答案:

您还可以将测试标记为xfail ,这意味着you know it will fail ,就像跳过:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

更多关于跳过你可以在pytest文档中找到

在Jenkins方面,您还可以通过try / catch语句操作构建的状态:

    try {
        bat "python -m pytest ..."
    } catch (pytestError) {
        // rewrite state of you build as you want, Success or Failed
        // currentBuild.result = "FAILED"
        currentBuild.result = "SUCCESS" // your case
        println pytestError
    }

但是请注意,它每次都会标记整个构建,因为这是pytest运行步骤的成功。 最佳做法只是通过@pytest.mark.skip跳过测试,如上所述。

我们使用在 Windows 系统上运行的 Jenkins,因此我们的测试列在 Jenkins“执行 Windows 批处理命令”部分中。 我能够通过使用单个 &(而不是 &&)分离可能有故障的测试来解决这个问题。 例如:"C:\\Program Files\\Git\\bin\\sh.exe" -c python -m venv env && pip3 install -r requirements.txt && py.test --tap-files test_that_may_fail.py & py.test - -tap-files next_test.py & py.test

由于我们使用 pytest,任何失败都会在 python 中用断言标记。 如果您使用“&&”,这将导致 Jenkins 作业中止并且不运行其他测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM