Pytest的设置和拆卸函数 - 与自己编写的函数一样吗?

10
在pytest文档的以下示例中:
函数setup_function应该为其他函数设置一些数据,比如说test_data。所以如果我编写函数test_data,我将不得不像这样调用setup_function

enter image description here

def test_data():
    setup_function(....)
    <Test logic here>
    teardown_function(....)

所以唯一的区别就是命名规范吗?

我不理解这个如何帮助我创建安装数据。我本可以像这样编写相同的代码:

def test_data():
    my_own_setup_function(....)
    <Test logic here>
    my_own_teardown_function(....)

因为没有办法告诉pytest自动将设置函数与创建的测试函数链接起来 - 如果我不需要函数指针,那么函数setup_function的参数function并不真正对我有帮助...所以为什么要无缘无故地创建命名约定呢?

据我所知,设置函数参数function只有在我需要使用函数指针时才会对我有所帮助 - 这是我很少需要的东西。


重点在于它们运行在你所有测试之前和之后,你只需设置一次并多次使用它们,它们就像其他测试套件中的beforeall和after。 - E.Serra
1
但是,如何将特定的setup_function链接到特定的测试函数,并使pytest将其视为设置函数而不是测试函数?它的命名约定是什么?那么,setup_function的命名约定是什么-我可以编写some_name函数,它是相同的... - Caffeine
1
很难相信pytest如此原始,竟然无法将特定的设置函数与特定的测试函数关联起来。 - Caffeine
1
你不需要在测试中调用它们。它们会自动被调用,这可能让你感到困惑。如果你想为特定的测试编写一个特定的函数,你可以使用自定义名称编写它,并在测试中调用它们。 - E.Serra
1
难道没有一个注释可以写在setup函数的上方,以便将其链接到特定测试而不需要在测试中调用任何内容吗?就像在setup_function或teardown上方编写@pytest.link('test_function_2')这样的东西?然后test_function_2将在其特定设置之后自动执行,并在其特定拆卸之前执行?我知道没有“link”选项,只是为了演示。 - Caffeine
显示剩余2条评论
2个回答

15
如果您想为一个或多个测试设置具体内容,可以使用“普通”的pytext fixture。
import pytest

@pytest.fixture
def setup_and_teardown_for_stuff():
    print("\nsetting up")
    yield
    print("\ntearing down")

def test_stuff(setup_and_teardown_for_stuff):
    assert 1 == 2
记住的一件事是,在yield之前的所有内容都在测试之前运行,而在yield之后的所有内容都在测试之后运行。
tests/unit/test_test.py::test_stuff 
setting up
FAILED
tearing down

1
那是一个非常酷的技巧,谢谢。 - pelos

12

答案

您的问题可以简化为:在pytest文档中描述的setup_functionteardown_function的用途/好处是什么?

使用这些函数的好处是,您不需要调用它们;setup_functionteardown_function将在每个测试之前和之后(分别)自动运行。

关于必须传递函数指针的问题,在pytest>=3.0中不再需要。从文档中可知:

从pytest-3.0开始,函数参数是可选的。

因此,您无需向setup_functionteardown_function函数传递函数指针;您只需按照下面的示例将它们添加到测试文件中即可执行。


示例

例如,如果您有一个名为test_setup_teardown.py的文件,看起来像:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


def setup_function():
    print('setting up')


def test_1():
    print('test 1')
    assert 1 == 2


def teardown_function():
    print('tearing down')

如果您使用pytest运行该文件(例如pytest test_setup_teardown.py),pytest将输出:

---- Captured stdout setup ----
setting up
---- Captured stdout call ----
test 1
---- Captured stdout teardown ----
tearing down
换句话说,pytest自动调用setup_function,然后运行测试(失败),最后运行teardown_function。这些函数的好处在于能够指定在所有测试运行之前和之后发生的事件。

我认为这是对第一个函数“setup_method”的调用。 - pelos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接