gitlab runner pytest 失败,但显示工作成功
Posted
技术标签:
【中文标题】gitlab runner pytest 失败,但显示工作成功【英文标题】:gitlab runner pytest fails but it shows job success 【发布时间】:2021-01-22 07:39:23 【问题描述】:我在整个互联网上搜索了这个问题,但找不到答案。
作业的输出是这样的:
test/test_something.py:25: AssertionError
========================= 1 failed, 64 passed in 2.10s =========================
Job succeeded
我的.gitlab-ci.yml
测试文件:
run_tests:
stage: test
tags:
- tests
script:
- echo "Running tests"
- ./venv/bin/python -m pytest
我正在使用 shell 执行器。 以前有人遇到过这个问题吗?据我了解,gitlab CI 取决于 pytest 的退出代码,如果退出代码不为零,它应该会失败,但在这种情况下,pytest 应该有退出代码 1,因为测试失败。
【问题讨论】:
尝试运行./venv/bin/python -m pytest || echo $?
查看实际退出代码
在您的 yml 配置中添加这些 pytest
开关以检查实际错误是什么:-rA
、-vvv
、--showlocals
【参考方案1】:
这与您的 gitlab-ci 脚本无关,而是您的 pytest 脚本(您用于运行测试的脚本或模块)。
下面我为您提供了一个示例,假设您可能使用 Flask CLI 之类的工具来管理您的测试。
您可以使用SystemExit
来提高退出代码。如果返回 0
以外的任何内容,则该过程将失败。简而言之,如果返回的退出代码是0
,GitLab 阶段就会成功。
Pytest 只运行测试但不返回退出代码。你可以在你的代码中实现它:
您的 manage.py(假设您使用的是 flask CLI)将如下所示:
import pytest
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command("tests")
@click.argument("option", required=False)
def run_test_with_option(option: str = None):
if option is None:
raise SystemExit(pytest.main())
注意上面的代码是如何raise
ing 并定义了tests
的flask CLI 命令。要运行您的代码,您只需将以下内容添加到您的 gitlab-ci 脚本中:
run_tests:
stage: test
tags:
- tests
variables:
FLASK_APP: manage.py
script:
- echo "Running tests"
- ./venv/bin/activate
- flask tests
将运行您的测试的脚本将是 flask tests
,它正在提升 SystemExit
,如图所示。
仅供参考:您可能不使用 Flask CLI 来管理您的测试脚本,而只是想运行一个测试脚本。在这种情况下,this answer 也可能会有所帮助。
【讨论】:
以上是关于gitlab runner pytest 失败,但显示工作成功的主要内容,如果未能解决你的问题,请参考以下文章
GitLab runner 获取子模块的“主机密钥验证失败”
在本地运行 GitLab 和 GitLab-Runner docker 实例时,管道中的构建步骤因连接被拒绝错误而失败
通过 SSH 将 gitlab-runner(服务器)连接到虚拟机失败:权限被拒绝(公钥、密码)
Gitlab-runner dind 导致错误:作业失败(系统故障):来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380: