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

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
  • 另外还有两个容易踩坑的细节:
    1. 你用replace('&lt;NODE_ID&gt;', viewer)替换URL占位符,但&lt;是HTML转义后的<,如果你的配置文件里的端点是原始的http://xxx?node=<NODE_ID>,应该替换<NODE_ID>而非转义后的字符串
    2. 原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:36:56