将几个列表传递到 Pytest 参数化

Pass several list into the Pytest parameterize

我想创建一个 PyTest,它根据环境验证我的文件夹是否存在。

是否可以为每个文件夹使用参数化创建单独的测试?

env folder
dev dev_data
dev logs
dev debug
prod prod_data

我的代码现在看起来像那样(但它不工作):

env = ["dev", "prod"]
expectedFoldersDev = ["dev_data", "logs", "debug"] # count of folders can be > 30
expectedFoldersProd = ["prod_data"]

@pytest.mark.parametrize("env, folder", [(env[0], expectedFoldersDev), 
                                             (env[1], expectedFoldersProd)])
                         
def test_are_folders_exist(env, folder):
    expected_folders = get_folders(env)
    assert folder in expected_folders

def get_folders():
   ...

您可以使用 dict(在此示例中为 FOLDERS)来存储您的测试值并定义一个方法(在此示例中为 get_items)以通过生成器扩展它可以直接传递给 @pytest.mark.parametrize 装饰器。这是一个工作示例。

import pytest


FOLDERS = {"dev": ["dev_data", "logs", "debug"], "prod": ["prod_data"]}


def get_items():
    for key, value in FOLDERS.items():
        for val in value:
            yield key, val


@pytest.mark.parametrize("env, folder", get_items())
def test_are_folders_exist(env, folder):
    print(f"Checking folder {folder} on env {env}...")
    expected_folders = get_folders(env)
    assert folder in expected_folders


def get_folders(env):
    # just for the example, it should be the method to be tested
    return FOLDERS.get(env)

它给出了这个输出。

pytest -s folders.py
# fixture.py Checking folder dev_data on env dev...
# .Checking folder logs on env dev...
# .Checking folder debug on env dev...
# .Checking folder prod_data on env prod...
# .