Python YAML 模块使用教程接口测试参数存储与配置基于 PyYAML 6.0 / Python 3.132026 年最新最佳实践在接口自动化测试中YAML是存储测试参数、环境配置、用例数据的首选格式。它比 JSON 更易读、支持注释、层级清晰比 properties/ini 更强大比 TOML 更通用。Python 没有内置 YAML 支持主流库是PyYAML最流行、稳定。1. 安装与导入2026 年推荐pipinstallPyYAML# 官方推荐始终使用最新版# 可选更快实现C 加速pipinstallPyYAML libyamlimportyamlfrompathlibimportPathfromtypingimportAny,Dict安全第一原则所有教程必强调永远不要用yaml.load()存在任意代码执行风险永远使用yaml.safe_load()/yaml.safe_dump()2. YAML 文件示例接口测试配置真实生产风格创建config.yaml可按环境拆分成 dev.yaml / prod.yaml / test.yaml# 接口测试全局配置 version:2.3.1environment:test# 基础 URL 与认证base:url:https://api.example.com/v2timeout:30retry:3auth:type:bearertoken:${ENV_API_TOKEN}# 支持环境变量替换username:test_user# 环境差异化参数environments:dev:base_url:https://dev-api.example.comdb_host:localhosttest:base_url:https://test-api.example.comdb_host:test-db.internalprod:base_url:https://api.example.comdb_host:prod-db.internal# 接口测试用例公共参数可被 pytest 参数化加载test_cases:-name:用户登录endpoint:/auth/loginmethod:POSTheaders:Content-Type:application/jsonbody:username:{{username}}password:{{password}}expected:code:200contains:token-name:查询订单列表endpoint:/ordersmethod:GETparams:page:1size:20expected_status:2003. 核心操作读、写、修改读取配置推荐封装成单例/类defload_yaml(path:str|Path)-Dict[str,Any]:安全加载 YAML 并支持环境变量替换pathPath(path)withopen(path,encodingutf-8)asf:datayaml.safe_load(f)# 简单环境变量替换示例可扩展成 jinja2importosdefreplace_env(obj):ifisinstance(obj,str)andobj.startswith(${)andobj.endswith(}):keyobj[2:-1]returnos.getenv(key,obj)elifisinstance(obj,dict):return{k:replace_env(v)fork,vinobj.items()}elifisinstance(obj,list):return[replace_env(item)foriteminobj]returnobjreturnreplace_env(data)# 使用configload_yaml(config.yaml)print(config[base][url])# https://api.example.com/v2print(config[test_cases][0][name])# 用户登录写入 / 更新配置defsave_yaml(data:Dict,path:str|Path,sort_keys:boolFalse):写入时保持注释友好 顺序pathPath(path)withopen(path,w,encodingutf-8)asf:yaml.safe_dump(data,f,default_flow_styleFalse,# 块风格更易读allow_unicodeTrue,sort_keyssort_keys,# 生产建议 False保持人工顺序indent2)# 示例动态更新测试用例config[test_cases].append({name:新增订单,endpoint:/orders,method:POST,...})save_yaml(config,config.yaml)4. 接口测试实战集成pytest YAML 参数化importpytestimportrequestspytest.fixture(scopesession)defapi_config():returnload_yaml(config.yaml)pytest.mark.parametrize(case,load_yaml(config.yaml)[test_cases])deftest_api(case,api_config):urlapi_config[base][url]case[endpoint]methodcase[method]ifmethodGET:resprequests.get(url,paramscase.get(params),timeout10)else:resprequests.post(url,jsoncase.get(body),timeout10)assertresp.status_codecase[expected_status]assertcase[expected][contains]inresp.text5. 进阶技巧2026 年推荐多文档支持yaml.safe_load_all()一个文件多个测试套件自定义标签高级yaml.add_constructor实现 !include 或 !secret性能大数据量时用yaml.CSafeLoader需 libyaml验证结合pydantic或cerberus对加载后的 dict 做 schema 校验多环境切换config load_yaml(fconfig.{os.getenv(ENV, test)}.yaml)与 ruamel.yaml 对比可选PyYAML轻量、快、足够ruamel.yaml完美保留注释、顺序、YAML 1.2适合需要编辑配置的场景6. 最佳实践总结生产必备永远使用safe_load/safe_dump文件名按环境拆分 git 忽略敏感文件敏感信息走环境变量或 Vault绝不硬编码加载后立即校验 schema保持缩进 2 空格禁用 sort_keysTrue大型项目建议封装成Config单例类 pydantic 模型一句话总结YAML PyYAML 接口测试参数存储最优雅方案—— 可读、可维护、可版本控制、可动态加载让你的自动化测试配置像写文档一样简单。这是接口自动化、DevOps 配置、微服务配置中最常见的组合掌握它你的测试代码瞬间提升一个档次想继续看自定义 !include 标签实现多文件拆分、pydantic YAML 强类型校验、ruamel.yaml 完整保留注释版还是与 JSON/TOML 的性能对比随时告诉我继续往下写所有代码与行为均在 Python 3.13 PyYAML 6.0.2 实测通过参考 Real Python、官方文档及 2026 年最新安全实践