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

如何测试方法内变量赋值 覆盖default_headers.update分支

问题场景

假设定义了如下request方法,接收str类型的url参数、默认值为None的dict类型headers参数:

def request(
    url: str,
    headers: dict = None
):
    default_headers = {
        "user-agent": "some user agent"
    }
    
    if isinstance(headers, dict):
        default_headers.update(headers)

方法内部逻辑:首先初始化携带默认user-agent的default_headers字典,若传入的headers参数为字典类型,则将传入headers的内容更新合并到default_headers中。
对该方法运行覆盖率检测时,报告提示default_headers.update(headers)语句缺少测试覆盖,需要编写对应测试覆盖该条语句。

问题原因

default_headers.update(headers) 语句未被覆盖,核心原因是现有所有测试用例执行时,都没有满足 isinstance(headers, dict) 为真的条件,也就是从来没有传过合法的字典类型headers参数到方法里,这个if分支从来没被走到过,对应语句自然不会被覆盖率工具统计到。

覆盖方法

你只需要补充一个测试用例:调用request方法时,传入一个字典类型的headers参数,即可走到该分支。为了保证逻辑正确性,你还可以在测试中对headers合并的结果做断言校验。

举个pytest框架下的测试示例:

# 从你存放request方法的模块导入方法
# from my_utils import request

def test_request_merge_custom_headers():
    test_url = "https://test.example.com"
    # 构造自定义的字典类型headers
    custom_headers = {
        "Authorization": "Bearer test_token_123",
        "Referer": "https://test.example.com/home",
        "user-agent": "my-custom-app/1.0"
    }

    # 调用方法,传入自定义headers,触发if分支执行
    # 注:如果你的request方法没有返回合并后的headers,可以通过mock等方式校验传入请求的headers值
    resp_headers = request(test_url, headers=custom_headers)

    # 校验合并结果符合预期
    assert resp_headers["Authorization"] == "Bearer test_token_123"
    assert resp_headers["Referer"] == "https://test.example.com/home"
    # 校验传入的user-agent覆盖了默认值
    assert resp_headers["user-agent"] == "my-custom-app/1.0"
补充说明

你现有测试大概率只覆盖了两类场景,因此没有触发对应分支:

  • 调用时不传headers参数,使用默认值None
  • 调用时传入了非字典类型的headers参数(比如字符串、列表、None之外的其他非dict类型值)

这两类场景都不会进入if判断的真分支,所以update语句始终没被执行。补充上述传入dict类型headers的用例后,该语句就会被正常覆盖。

另外提一句,你当前写的headers: dict = None默认参数写法是正确的,不要改成可变默认参数headers: dict = {},避免出现跨调用状态污染的问题。

内容的提问来源于stack exchange,提问作者Stephen K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:42:16