无需conftest.py,如何从YAML流水线传参给pytest测试类?
解决方法
方案1:修复环境变量传递与读取逻辑
先检查YAML流水线里的环境变量是否在pytest执行前正确设置,且能被pytest进程继承:
- YAML中pytest执行步骤示例:
steps: - script: | export SUBSCRIPTION_ID=$(your-subscription-id-value) export RESOURCE_GROUP=$(your-resource-group-value) pytest your_test_file.py::TestTrainingPipeline -v displayName: 'Run Training Pipeline Tests'
- 在
TestTrainingPipeline类里用os.getenv()准确读取变量(注意大小写完全匹配):
import os from azure.identity import DefaultAzureCredential from azure.mgmt.datafactory import DataFactoryManagementClient class TestTrainingPipeline: def setup_class(self): self.subscription_id = os.getenv("SUBSCRIPTION_ID") self.resource_group_name = os.getenv("RESOURCE_GROUP") if not self.subscription_id or not self.resource_group_name: raise ValueError("Required environment variables are missing") self.adf_client = DataFactoryManagementClient( DefaultAzureCredential(), self.subscription_id )
之前变量返回None,大概率是YAML里的环境变量没注入到pytest的执行上下文,或者变量名拼写错误。
方案2:直接通过pytest命令行参数传递
不用conftest.py的话,可直接在测试文件里定义命令行参数,并在测试类中读取:
- YAML里的pytest命令添加自定义参数:
steps: - script: | pytest your_test_file.py::TestTrainingPipeline -v \ --subscription-id $(your-subscription-id-value) \ --resource-group $(your-resource-group-value) displayName: 'Run Training Pipeline Tests'
- 在测试文件里添加参数定义和测试类逻辑:
import sys from azure.identity import DefaultAzureCredential from azure.mgmt.datafactory import DataFactoryManagementClient # 直接在测试文件里定义pytest命令行参数,无需conftest def pytest_addoption(parser): parser.addoption("--subscription-id", required=True, help="Azure subscription ID") parser.addoption("--resource-group", required=True, help="Azure resource group name") class TestTrainingPipeline: def setup_class(self, request): # 通过request fixture获取命令行参数 self.subscription_id = request.config.getoption("--subscription-id") self.resource_group_name = request.config.getoption("--resource-group") self.adf_client = DataFactoryManagementClient( DefaultAzureCredential(), self.subscription_id )
pytest会自动识别测试文件里的pytest_addoption钩子,不需要额外配置。
方案3:临时配置文件传递参数
如果前两种方式不适用,可在YAML中把参数写入临时配置文件,再由测试类读取:
- YAML步骤示例:
steps: - script: | echo '{"subscription_id": "$(your-subscription-id-value)", "resource_group": "$(your-resource-group-value)"}' > test_config.json pytest your_test_file.py::TestTrainingPipeline -v displayName: 'Run Training Pipeline Tests'
- 测试类读取配置文件:
import json from azure.identity import DefaultAzureCredential from azure.mgmt.datafactory import DataFactoryManagementClient class TestTrainingPipeline: def setup_class(self): with open("test_config.json", "r") as f: config = json.load(f) self.subscription_id = config["subscription_id"] self.resource_group_name = config["resource_group"] self.adf_client = DataFactoryManagementClient( DefaultAzureCredential(), self.subscription_id )
内容的提问来源于stack exchange,提问作者Obiii
相关产品推荐
相关产品推荐

