作者:fmz4733974 | 来源:互联网 | 2023-09-11 14:51
如评论中所建议,使用pytest-
xdist
将是解决方案。该插件设计用于并行或分布式执行测试(甚至可以执行多平台),但是非常适合满足您在单独的过程中运行每个测试的请求-
您可以使用--forked
参数来实现。
免责声明
--forked
参数在Windows上不起作用,因为Windows不支持fork-exec模型,并且不提供任何替代fork()
。
快速演示
让我们定义一个夹具,它将在运行每个测试之前尝试打开急切的执行:
from tensorflow.contrib.eager.python import tfe
import pytest
@pytest.fixture(scope='function', autouse=True)
def eager(request):
tfe.enable_eager_execution()
很显然,该夹具将无法通过所有测试,但第一个测试将失败,因为急切的执行只能进行一次。通过一些虚拟测试:
def test_spam():
assert True
def test_eggs():
assert True
def test_bacon():
assert True
普通运行pytest
失败,按预期进行:
$ pytest -v
============================== test session starts ================================
platform darwin -- Python 3.6.3, pytest-3.3.1, py-1.5.2, pluggy-0.6.0 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-48234032, inifile:
plugins: forked-0.2, mock-1.6.3, hypothesis-3.44.4
collected 3 items
test_spam.py::test_spam PASSED [ 33%]
test_spam.py::test_eggs ERROR [ 66%]
test_spam.py::test_bacon ERROR [100%]
...
E ValueError: Do not call tfe.enable_eager_execution more than once in the
same process. Note eager-mode methods such as tfe.run() also call
tfe.enable_eager_execution.
...
现在安装pytest-xdist
:
$ pip install pytest-xdist
并重新运行测试:
$ pytest -v --forked
============================== test session starts ================================
platform darwin -- Python 3.6.3, pytest-3.3.1, py-1.5.2, pluggy-0.6.0 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-48234032, inifile:
plugins: forked-0.2, xdist-1.22.0, mock-1.6.3, hypothesis-3.44.4
collected 3 items
test_spam.py::test_spam PASSED [ 33%]
test_spam.py::test_eggs PASSED [ 66%]
test_spam.py::test_bacon PASSED [100%]
============================= 3 passed in 6.09 secOnds============================
测试仍然按顺序运行,但是每个测试都在一个自己的子流程中,因此它们都不会失败。
现在您可以开始尝试并行执行,例如
$ pytest -v --forked --numprocesses=auto
等等。有关更多信息和更多用法示例,请参阅插件文档。