7

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

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

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

我们正试图弄清楚我们是否应该 - 修复/使用 nosepipe - 切换到 nose2 并编写 nosepipe2。- 使用 pytest 或其他一些测试框架。

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

4

1 回答 1

13

pytest 有xdist 插件,它提供了--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进程数时才有效,因为没有重新启动垂死的测试进程。无需太多努力即可消除此限制。同时,您将不得不使用安全装箱选项。

于 2012-08-04T08:08:10.053 回答