gpt4 book ai didi

python - pytest——如何使用全局/ session 范围的固定装置?

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

我想要一个“全局 fixture ”(在 pytest 中,它们也可以称为“ session 范围的 fixture ”),它可以进行一些昂贵的环境设置,比如通常准备一个资源,然后在测试模块中重复使用。设置是这样的,

共享环境.py

会有一个固定装置做一些昂贵的事情,比如启动 Docker 容器、MySQL 服务器等。

@pytest.yield_fixture(scope="session")
def test_server():
start_docker_container(port=TEST_PORT)
yield TEST_PORT
stop_docker_container()

test_a.py

会使用服务器,

def test_foo(test_server): ...

测试_b.py

将使用相同的服务器

def test_foo(test_server): ...

似乎 pytest 通过 scope="session" 对此提供了支持,但我不知道如何使实际导入工作。当前设置将给出一条错误消息,例如,

fixture 'test_server' not found
available fixtures: pytestconfig, ...
use 'py.test --fixtures [testpath] ' for help on them

最佳答案

pytest 中有一个约定,它使用名为 conftest.py 的特殊文件并包含 session 装置。

我提取了两个非常简单的例子来快速入门。他们不使用类。

一切取自http://pythontesting.net/framework/pytest/pytest-session-scoped-fixtures/

示例 1:

除非作为参数提供给 test_* 函数,否则不会执行 fixture。 fixture some_resource 在调用引用函数之前执行,在本例中为 test_2。另一方面,终结器在最后执行。

conftest.py:

import pytest
@pytest.fixture(scope="session")

def some_resource(request):
print('\nSome resource')

def some_resource_fin():
print('\nSome resource fin')

request.addfinalizer(some_resource_fin)

test_a.py:

def test_1():
print('\n Test 1')

def test_2(some_resource):
print('\n Test 2')

def test_3():
print('\n Test 3')

结果:

$ pytest -s
======================================================= test session starts ========================================================
platform linux -- Python 3.4.3 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/d2, inifile:
collected 3 items

test_a.py
Test 1
.
Some recource

Test 2
.
Test 3
.
Some resource fin

示例 2:

这里的fixture配置了autouse=True,所以在session开始时执行一次,不需要引用。它的终结器在 session 结束时执行。

conftest.py:

import pytest
@pytest.fixture(scope="session", autouse=True)

def auto_resource(request):
print('\nSome resource')

def auto_resource_fin():
print('\nSome resource fin')

request.addfinalizer(auto_resource_fin)

test_a.py:

def test_1():
print('\n Test 1')

def test_2():
print('\n Test 2')

def test_3():
print('\n Test 3')

结果:

$ pytest -s
======================================================= test session starts ========================================================
platform linux -- Python 3.4.3 -- py-1.4.26 -- pytest-2.7.0
rootdir: /tmp/d2, inifile:
collected 3 items

test_a.py
Some recource

Test 1
.
Test 2
.
Test 3
.
Some resource fin

关于python - pytest——如何使用全局/ session 范围的固定装置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26899001/

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