Python单元测试如何动态修改分页方法self.flag值实现100%测试覆盖率
解决方案
实现逻辑
要实现第一次循环self.flag为1、第二次循环self.flag为0的效果,你可以借助mock框架的side_effect能力,配合分页游标的返回值控制循环执行次数,具体调整如下:
- 初始状态将
self.slack.flag设为1,保证第一次循环不会触发break逻辑 - 给
extract_next_page_cursor方法配置side_effect,第一次被调用时先把self.slack.flag修改为0,同时返回一个有效游标,保证第二次循环可以正常进入 - 第二次循环执行到
if not self.flag判断时,会触发break,即可覆盖到所有分支逻辑
调整后的测试代码
def test_pagination_logic_two_cycles(self): """Test pagination logic with two cycles (flag=1 first time, flag=0 second time).""" allow(self.slack).fetch_response_from_api.and_return(None) allow(self.slack).extract_records.and_return(RESPONSE.get('entries')) allow(self.slack).publish_records.and_return(None) # 配置extract_next_page_cursor的side_effect,第一次调用时修改flag def modify_flag_side_effect(): self.slack.flag = 0 # 返回有效游标,保证第二次循环可以进入 return 'second_cursor' allow(self.slack).extract_next_page_cursor.side_effect = modify_flag_side_effect # 初始状态配置 self.slack.next_page_cursor = 'first_cursor' self.slack.flag = 1 self.slack.page = 0 result = self.slack.pagination_logic('topic_name') assert result is None # 可选校验:page只加了1次,说明只走了一次extract_next_page_cursor,第二次循环触发了break assert self.slack.page == 1
如果需要100%覆盖所有代码分支,还需要补充一个测试用例覆盖while循环的else分支(即循环正常执行完成没有触发break的场景):
def test_pagination_logic_full_pagination(self): """Test pagination logic that finishes all pages and triggers the else clause.""" allow(self.slack).fetch_response_from_api.and_return(None) allow(self.slack).extract_records.and_return(RESPONSE.get('entries')) allow(self.slack).publish_records.and_return(None) # 第一次调用返回None,让next_page_cursor变为空,循环正常结束 allow(self.slack).extract_next_page_cursor.and_return(None) # 初始状态配置 self.slack.next_page_cursor = 'first_cursor' self.slack.flag = 1 self.slack.page = 0 result = self.slack.pagination_logic('topic_name') assert result is None assert self.slack.page == 1
内容的提问来源于stack exchange,提问作者Aman Raheja
相关产品推荐
相关产品推荐

