pytest - 如何在特定测试后执行函数

pytest - How to execute a function after specific tests

我有几个 classes 组织的一些测试。我已经有一个 scope=class 的测试夹具,这样它会在测试套件(class)之前 运行 。但是,我需要在一些特定的测试之后执行一个函数。可以说我在 class 中有 100 个测试,我已经有一个夹具可以在这些测试之前执行一个函数,但我还想 运行 在这些测试中的 2-3 个之后执行一个函数。

实现该目标的最佳方法是什么?可以用固定装置或其他任何东西来完成吗?

如果您正在使用 python 的内置单元测试模块,您可以在 class 中的每个测试后将 tearDown 方法覆盖为 运行 某些内容。

如果您正在使用 pytest 的框架并使用 pytests fixtures,则可以在 fixtures 中使用 yield 关键字。

它记录在 https://doc.pytest.org/en/latest/fixture.html#teardown-cleanup-aka-fixture-finalization 中。

如果您知道要进行的特定测试 运行,您可以在 .csv 中为每个测试设置不同的值来设置测试 例如 (索引)(列)(列) 测试 测试# 完成了吗? 测试 1 1 T 测试 2 2 F

import pandas as pd 
#makes panda read your file and sets the variable as the data in the file
data = pd.read_csv("filename.csv") 
#Gets the value from the column 'test#' and 'complete' and sets as a variable
Var1 = DataFrame.get_value("the number test you want to take", 'Complete?')
If Var1 = T 
   #Run the rest of your program here
#Then you can just repeat this for the other tests you want to check for 

这不是最漂亮的解决方案,但它确实有效


首先,编写一个将在测试完成后执行的夹具:

@pytest.fixture
def foo():
    yield
    print("do stuff after test")

文档:Fixture finalization / executing teardown code

现在用 usefixtures("foo"):

标记每个应该调用这个夹具的测试
@pytest.mark.usefixtures("foo")
def test_spam():
    ...

文档:Use fixtures in classes and modules with usefixtures