You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:37:29