gpt4 book ai didi

python - nose2 与 py.test 隔离进程

转载 作者:太空狗 更新时间:2023-10-29 22:11:41 26 4
gpt4 key购买 nike

我们一直在使用 nosetest 来运行和收集我们的单元测试(它们都是用我们喜欢的 python 单元测试编写的)。我们喜欢 Nose 的地方:

  • 使用标准的 Python 单元测试(我们喜欢这种强加的结构)。
  • 支持在 xml 中报告覆盖率和测试输出(对于 jenkins)。

我们缺少的是在隔离进程中运行测试同时保持良好错误报告的好方法(我们正在通过 python 测试 C++ 库,因此段错误不应该是灾难性的)。鼻管似乎不再维护,我们遇到了一些问题。

我们正在尝试弄清楚我们是否应该- 修理/使用鼻管- 切换到 nose2 并写入 nosepipe2。- 使用 pytest 或其他一些测试框架。

我们更愿意使用具有良好社区的方法。看来我们的问题(需要良好隔离的 C++ 插件)可能是一个常见问题,但谷歌搜索我还没有找到维护的解决方案。感谢更有经验的负责人的建议。

最佳答案

pytest 有 xdist plugin它提供了 --boxed 选项在受控子流程中运行每个测试。这是一个基本示例::

# content of test_module.py

import pytest
import os
import time

# run test function 50 times with different argument
@pytest.mark.parametrize("arg", range(50))
def test_func(arg):
time.sleep(0.05) # each tests takes a while
if arg % 19 == 0:
os.kill(os.getpid(), 15)

如果你用::运行它

$ py.test --boxed
=========================== test session starts ============================
platform linux2 -- Python 2.7.3 -- pytest-2.3.0.dev8
plugins: xdist, bugzilla, cache, oejskit, cli, pep8, cov
collecting ... collected 50 items

test_module.py f..................f..................f...........

================================= FAILURES =================================
_______________________________ test_func[0] _______________________________
/home/hpk/tmp/doc-exec-420/test_module.py:6: running the test CRASHED with signal 15
______________________________ test_func[19] _______________________________
/home/hpk/tmp/doc-exec-420/test_module.py:6: running the test CRASHED with signal 15
______________________________ test_func[38] _______________________________
/home/hpk/tmp/doc-exec-420/test_module.py:6: running the test CRASHED with signal 15
=================== 3 failed, 47 passed in 3.41 seconds ====================

您会看到有几个测试被报告为崩溃,表明通过小写的 f 和相应的失败摘要。您也可以使用xdist 提供的并行化功能可加速您的测试::

$ py.test --boxed -n3
=========================== test session starts ============================
platform linux2 -- Python 2.7.3 -- pytest-2.3.0.dev8
plugins: xdist, bugzilla, cache, oejskit, cli, pep8, cov
gw0 I / gw1 I / gw2 I
gw0 [50] / gw1 [50] / gw2 [50]

scheduling tests via LoadScheduling
..f...............f..................f............
================================= FAILURES =================================
_______________________________ test_func[0] _______________________________
[gw0] linux2 -- Python 2.7.3 /home/hpk/venv/1/bin/python
/home/hpk/tmp/doc-exec-420/test_module.py:6: running the test CRASHED with signal 15
______________________________ test_func[19] _______________________________
[gw2] linux2 -- Python 2.7.3 /home/hpk/venv/1/bin/python
/home/hpk/tmp/doc-exec-420/test_module.py:6: running the test CRASHED with signal 15
______________________________ test_func[38] _______________________________
[gw2] linux2 -- Python 2.7.3 /home/hpk/venv/1/bin/python
/home/hpk/tmp/doc-exec-420/test_module.py:6: running the test CRASHED with signal 15
=================== 3 failed, 47 passed in 2.03 seconds ====================

原则上,仅分发到并行子进程通常就足够了,并且避免了为每个测试启动盒装进程的开销。这目前仅在您的崩溃测试少于 -n 数量的进程时才有效,因为垂死的测试进程不会重新启动。这个限制可能不需要太多的努力就可以被移除。同时,您将不得不使用安全装箱选项。

关于python - nose2 与 py.test 隔离进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11802316/

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