Pytest Fixture报错‘function object is not subscriptable’求助
解决
viewers_buffer_health Fixture的'function' object is not subscriptable错误 你的问题根源其实很容易被忽略——viewers_buffer_health fixture没有声明对settings fixture的依赖,导致你在里面使用的settings根本不是你之前定义的那个加载了YAML配置的字典,而是一个同名的函数/内置对象,自然无法做下标访问。
核心修复点:
- 必须在
viewers_buffer_health的参数列表中加入settings,让pytest自动注入你定义的配置fixture - 另外还有两个容易踩坑的细节:
- 你用
replace('<NODE_ID>', viewer)替换URL占位符,但<是HTML转义后的<,如果你的配置文件里的端点是原始的http://xxx?node=<NODE_ID>,应该替换<NODE_ID>而非转义后的字符串 - 原代码中
requests.get(...)后没有调用.json(),即使请求成功,data也是Response对象,后续的data[0]['avg_buffer_health']也会报错
- 你用
修复后的完整代码:
import pytest import requests import yaml @pytest.fixture def settings(): with open('../config.yaml') as yaml_stream: # 安全提示:yaml.load存在代码注入风险,推荐使用yaml.safe_load return yaml.load(stream=yaml_stream) @pytest.fixture def viewers(settings): try: data = requests.get(settings['endpoints']['viewers']).json() return data[0]['viewers'] except Exception: print('ERROR retrieving viewers') raise SystemExit @pytest.fixture def viewers_buffer_health(settings, viewers): # 新增settings参数注入依赖 print(viewers) viewers_with_buffer_health = {} for viewer in viewers: try: # 根据实际配置调整占位符:如果是原始<NODE_ID>就用这个,转义的就改回&<NODE_ID> target_url = settings['endpoints']['node_buffer_health'].replace('<NODE_ID>', viewer) response_data = requests.get(target_url).json() # 补上.json()解析响应 viewers_with_buffer_health[viewer] = response_data[0]['avg_buffer_health'] except Exception as e: print(f'ERROR retrieving buffer_health for {viewer}: {str(e)}') raise SystemExit return viewers_with_buffer_health
额外优化建议:
- 替换
yaml.load为yaml.safe_load,避免加载恶意YAML文件带来的安全风险 - 不要直接
raise SystemExit终止进程,改用pytest.fail("错误信息"),这样pytest能正常收集并展示测试失败原因,而不是直接退出 - 可以给requests请求添加超时时间,避免因服务无响应导致测试卡住:
requests.get(target_url, timeout=10).json()
内容的提问来源于stack exchange,提问作者user4093955
相关产品推荐
相关产品推荐

