3

我最低限度地使用 pytest 作为通用测试运行程序,用于针对工作中的各种 API 产品进行大型自动化集成测试,并且我一直在尝试找到一个同样通用的拆卸函数示例,该示例在任何测试完成时运行,无论成功或失败。

我的典型使用模式是超线性的,通常是这样的:

def test_1():
    <logic>
    assert something

def test_2():
    <logic>
    assert something

def test_3():
    <logic>
    assert something

有时,当这样做有意义时,我会在我的脚本顶部放入一个设置夹具,其中 autouse 参数设置为“True”,该参数在每个脚本启动时运行:

@pytest.fixture(scope="session", autouse=True)
def setup_something():
    testhelper = TestHelper
    testhelper.create_something(host="somehost", channel="somechannel")

def test_1():
    <logic>
    assert something

def test_2():
    <logic>
    assert something

def test_3():
    <logic>
    assert something

直到最近,一次性 docker 环境让我能够跳过整个拆卸过程而侥幸逃脱,但我有点紧张,其中一个现在不可用。理想情况下,在不偏离我已经使用过的相同线性模式的情况下,我将如何实现另一个 pytest 夹具,它可以执行以下操作:

@pytest.fixture
def teardown():
    testhelper = TestHelper
    testhelper.delete_something(thing=something)

什么时候运行完成?

4

2 回答 2

5

每个夹具都可能有拆卸部分:

@pytest.fixture
def something(request):
   # setup code
   def finalize():
       # teardown code
   request.addfinalizer(finalize)
   return fixture_result

或者我通常使用它:

@pytest.fixture
def something():
    # setup code
    yield fixture_result
    # teardown code

请注意,在 pytest pre-3.0 中,后一个习语所需的装饰器是@pytest.yield_fixture. 然而,从 3.0 开始,可以只使用常规@pytest.fixture装饰器,并且@pytest.yield_fixture推荐使用

在这里查看更多

于 2015-11-07T13:38:35.067 回答
1

你可以在你的conftest.py

def pytest_runtest_setup(item):
    pass    

def pytest_runtest_teardown(item):
    pass

请参阅此处获取文档

于 2015-11-06T17:36:30.983 回答