从 noses setup_package() 迁移到 pytest

Migrating form noses setup_package() to pytest

现在我正在尝试将一些 API 测试从 Nose 转换为 Pytest。当我尝试这样做时,我遇到了一个小问题:Pytest 不支持 "setup_package()" 功能。 "setup_package()" 在测试所在的 __init__.py 文件中。

这是目录结构:

tests/__init__.py
      test_001.py
      test_002.py
      ...

一个简单的解决方案是给 setup_package() 函数一个固定装置,但这里的问题是,我的 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 的新手,我想知道 "pytestian" 将这个特定示例迁移到 Pytest 的方法!我的第一个想法是使用具有参数功能的夹具,但我不确定这是否是一个很好的迁移方式。

正如@hoefling 已经在评论中暗示的那样:

我刚刚在测试目录中创建了一个新的 conftest.py(与 相关)文件(有关文件夹结构,请参阅初始问题)。

tests/__init__.py
      conftest.py
      test_001.py
      test_002.py
      ... 

在那个 conftest.py 文件中,我刚刚复制了 setup_package 函数,具有以下固定装置:

@pytest.fixture(scope='session', autouse=True)
def setup_and_teardown_package():
(...) #setup
yield
(...) #teardown

关于 counter_id:我们不再需要 flags,因为我们的 setupteardown 有一个函数,因此变量不会迷路了。 yield 告诉函数停止,直到完成所有测试,然后继续该方法。所以基本上:所有 BEFORE yield 都会像设置一样,所有 AFTER yield 都会像拆解 - > 不再需要全局变量了:)