现在我正在尝试将一些API测试从Nose转换为Pytest。当我尝试这样做时,我遇到了一个小问题:Pytest不支持“setup_package()”功能。 “setup_package()”位于测试所在的__init__.py文件中。
这是目录结构:
tests/__init__.py
test_001.py
test_002.py
...
一个简单的解决方案是给setup_package()函数一个fixture,但问题是,我的setup_package()正在访问__init__.py中的全局计数器。这样__ini__.py文件看起来像这样:
counter_id = 0
def setup_package():
global counter
counter = some_function()
def teardown_package():
global counter
clear_object(counter_id)
我很确定,有一个非常简单的解决方案来迁移这个但是因为我是Pytest的新手我想知道将这个特定的例子迁移到Pytest的“pytestian”方式!我的第一个想法是使用具有params功能的夹具,但我不确定它是否是一种很好的迁移方式。
正如@hoefling已在评论中暗示:
我刚刚在tests目录中创建了一个新的conftest.py(与In pytest, what is the use of conftest.py files?相关)文件(请参阅文件夹结构的初始问题)。
tests/__init__.py
conftest.py
test_001.py
test_002.py
...
在那个conftest.py文件中,我刚刚使用以下fixture修复了setup_package函数:
@pytest.fixture(scope='session', autouse=True)
def setup_and_teardown_package():
(...) #setup
yield
(...) #teardown
关于counter_id
:我们不再需要flags
了,因为我们的setup
和teardown
只有一个函数,因此变量不会丢失。 yield
告诉函数停止,直到所有测试完成,然后继续该方法。所以基本上:yield
之前的所有东西都会像设置一样,而yield
之后的所有东西都会像拆机一样 - >不再需要全局变量:)