gpt4 book ai didi

python - 如何让 uwsgi 退出并返回任何失败子进程的代码

转载 作者:太空狗 更新时间:2023-10-30 01:36:30 25 4
gpt4 key购买 nike

我正在编写一些涉及在 uwsgi 下运行的 Python 应用程序的集成测试。
为了测试这个方面,我正在运行一个 uwsgi 假脱机程序,它需要 master进程正在运行。
如果 pytest 有一个失败的测试,它会返回一个非零的退出代码,这很棒。
没有master进程,整个uwsgi进程也返回这个exit code,所以我们的持续集成服务器相应的响应。
但是,当主进程正在运行时,它总是以零退出代码退出 - 无论测试是否失败。

我需要它传递子进程的第一个非零退出代码(如果有的话)。

注意:我对模拟这个不是很感兴趣 - 我需要测试这个工作。

我创建了一个 Dockerized Minimal, Complete, and Verifiable Example这说明了我的问题:

Docker 文件:

FROM python:3.6.4-slim-stretch

WORKDIR /srv

RUN apt-get update \
&& apt-get install -y build-essential \
&& pip install uwsgi pytest

COPY test_app.py /srv/

CMD ['/bin/bash']

test_app.py:

import pytest

def test_this():
assert 1==0

给定目录中的上述 2 个文件,如果我在没有主进程的 uwsgi 下运行此失败测试,则以下显示返回代码:

$ docker build -t=test .
$ docker run test uwsgi --chdir /srv --pyrun /usr/local/bin/pytest
...
============================= test session starts ==============================
platform linux -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /srv, inifile:
collected 1 item

test_app.py F [100%]

=================================== FAILURES ===================================
__________________________________ test_this ___________________________________

def test_this():
> assert 1==0
E assert 1 == 0

test_app.py:4: AssertionError
=========================== 1 failed in 0.05 seconds ===========================
$ echo $?
1

注意:您可以看到此过程(最后一行)的返回码按要求非零


现在,除了用主进程运行 uwsgi 之外,我们得到以下输出:

$ docker run test uwsgi --set master=true --chdir /srv --pyrun /usr/local/bin/pytest
...
============================= test session starts ==============================
platform linux -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /srv, inifile:
collected 1 item

test_app.py F [100%]

=================================== FAILURES ===================================
__________________________________ test_this ___________________________________

def test_this():
> assert 1==0
E assert 1 == 0

test_app.py:4: AssertionError
=========================== 1 failed in 0.05 seconds ===========================
worker 1 buried after 0 seconds
goodbye to uWSGI.
$ echo $?
0

注意:这次来自此过程(最后一行)的返回码为零 - 即使测试失败

如何让 uwsgi 将失败进程的退出代码转发给 master?

最佳答案

这行得通,但感觉有点hacky。如果有更好的答案,我会很乐意接受。

我通过添加两个附加文件(以及对 Dockerfile 的一个小更新)完成了这项工作:

Dockerfile:

FROM python:3.6.4-slim-stretch

WORKDIR /srv

RUN apt-get update \
&& apt-get install -y build-essential \
&& pip install uwsgi pytest

COPY test_app.py test run_tests.py /srv/

CMD ['/bin/bash']

测试:

#!/bin/bash
uwsgi --set master=true --chdir /srv --pyrun /srv/run_tests.py
exit $(cat /tmp/test_results)

run_tests.py:

#!/usr/bin/python

import re
import subprocess
import sys

from pytest import main


def write_result(retcode):

path = r'/tmp/test_results'
with open(path, 'w') as f:
f.write(str(retcode))


def run():

sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
retcode = 1
try:
retcode = main()
finally:
write_result(retcode)

sys.exit(retcode)


if __name__ == '__main__':
run()

它的工作方式是我将 pytest 程序复制并调整到 run_tests.py 中,它将测试的返回代码写到一个临时文件中。测试通过 bash 脚本运行:test,它运行 uwsgi,后者运行测试,然后使用测试的返回代码退出脚本。

结果现在看起来像:

$ docker build -t=test .
$ docker run test /srv/test
...
============================= test session starts ==============================
platform linux -- Python 3.6.4, pytest-3.3.2, py-1.5.2, pluggy-0.6.0
rootdir: /srv, inifile:
collected 1 item

test_app.py F [100%]

=================================== FAILURES ===================================
__________________________________ test_this ___________________________________

def test_this():
> assert 1==0
E assert 1 == 0

test_app.py:4: AssertionError
=========================== 1 failed in 0.05 seconds ===========================
worker 1 buried after 0 seconds
goodbye to uWSGI.
$ echo $?
1

关于python - 如何让 uwsgi 退出并返回任何失败子进程的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48233528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com