Pytest如何使用多个场景参数化测试?

2024-10-02 12:23:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pytest、boto3和aws,并希望使用参数化测试进行动态断言。如何改进此代码,使其仅在特定的子网组上断言

production_private_ids = ["subnet-08f6d70b65b5cxx38", "subnet-0b6aaaf1ce207xx03", "subnet-0e54fda8f811fxxd8"]) ....
nonproduction_private_ids = ["subnet-11f6xx0b65b5cxx38", "subnet-116aaaf1ce207xx99", "subnet-11xxfda8f811fxx77"]) ....


@pytest.mark.parametrize("subnet", ["production_private_ids", "nonproduction_private_ids", "nonproduction_public_ids","production_public_ids ")

# if environment = production, then only check if production_private_ids exists in team_subnet

def test_sharing_subnets_exist(subnet,accountid):
    team_subnet =  get_team_subnets(accountid)
    assert subnet in team_subnet


# if environment = nonproduction, then only check if nonproduction_private_ids exists in team_subnet
def test_sharing_subnets_exist(subnet,accountid):
    team_subnet =  get_team_subnets(accountid)
    assert subnet in team_subnet

Tags: inidsifenvironmentpytest断言privatepublic
2条回答

一种常见的做法是设置和读取环境变量,以确定运行的平台

例如,在环境中可以有一个变量isProduction=1。然后在代码中,您可以通过os.environ['isProduction'] == 1进行检查

出于安全等原因,您甚至可以在环境中保存私有ID。 例如,在环境中,可以在非生产上使用以下变量

id1="subnet-11f6xx0b65b5cxx38"
id2="subnet-116aaaf1ce207xx99"
id3"subnet-11xxfda8f811fxx77"

另一套在生产机器上

id1="subnet-08f6d70b65b5cxx38"
id2="subnet-0b6aaaf1ce207xx03"
id3="subnet-0e54fda8f811fxxd8"

在你做的代码中

import os
private_ids = [os.environ['id1'], os.environ['id2'], os.environ['id3']]

因此,您将获得每台机器上的配置。只需确保在您的工作流/测试流中环境变量的来源正确

如果需要在参数化上执行其他逻辑,可以通过metafunc参数化测试。例如:

import os
import pytest

production_private_ids = [...]
nonproduction_private_ids = [...]


def pytest_generate_tests(metafunc):
    # if the test has `subnet` in args, parametrize it now
    if 'subnet' in metafunc.fixturenames:
        # replace with your environment check
        if os.environ.get('NAME', None) == 'production':
            ids = production_private_ids
        else:
            ids = nonproduction_private_ids
        metafunc.parametrize('subnet', ids)


def test_sharing_subnets_exist(subnet, accountid):
    team_subnet =  get_team_subnets(accountid)
    assert subnet in team_subnet

现在运行pytest ...将只检查非生产ID,而NAME="production" pytest ...将只检查生产ID

相关问题 更多 >

    热门问题