如何测试方法内变量赋值 覆盖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

