【问题标题】:Basic pytest teardown that runs on test completion在测试完成时运行的基本 pytest 拆解
【发布时间】:2015-11-06 02:25:59
【问题描述】:

我很少使用 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)

什么时候运行完成?

【问题讨论】:

    标签: pytest fixtures teardown


    【解决方案1】:

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

    @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_fixturedeprecated

    查看更多here

    【讨论】:

      【解决方案2】:

      您可以在 conftest.py 中使用这些功能

      def pytest_runtest_setup(item):
          pass    
      
      def pytest_runtest_teardown(item):
          pass
      

      请参阅 here 获取文档

      【讨论】:

      • 我不清楚这里的“项目”是什么。你能举个例子吗?如果我只想删除一个文件怎么办?
      猜你喜欢
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 2019-11-04
      • 2020-04-25
      • 1970-01-01
      • 2020-06-14
      • 2023-02-09
      相关资源
      最近更新 更多