如何为统计数组最大值出现次数的代码编写TDD规范的pytest测试用例
问题根因
你编写的测试用例无法运行的核心原因有两个:
- 原
main.py没有定义名为main_function的可导入调用函数,所有逻辑都封装在if __name__ == "__main__"的入口块中,仅直接运行脚本时才会触发执行,导入模块时不会运行 - 原脚本的逻辑是直接从标准输入读取内容、最终打印结果,没有返回值,无法直接用
assert判断返回结果
解决方案
方案1:重构原代码抽离核心逻辑(推荐)
这是符合TDD规范的最佳实践,将核心计算逻辑和IO操作分离,既保留原有运行逻辑,又方便单元测试。
修改后的main.py代码
# main.py def count_max_occurrence(numbers: list[int]) -> int: """统计输入列表中最大值的出现次数""" if not numbers: return 0 max_val = max(numbers) return numbers.count(max_val) if __name__ == "__main__": l = [] while True: x = int(input()) if x == 0: break l.append(x) print(count_max_occurrence(l))
pytest测试用例代码(新建test_main.py)
注意:原代码逻辑中输入的0是终止符,不会存入统计列表,因此测试传参需要剔除末尾的0。
# test_main.py import pytest from main import count_max_occurrence def test_max_occurrence_once(): # 对应输入序列:1、7、9、0 assert count_max_occurrence([1,7,9]) == 1 def test_max_occurrence_twice(): # 对应输入序列:1、3、3、1、0 assert count_max_occurrence([1,3,3,1]) == 2
方案2:不修改原代码,模拟输入测试
如果你不想改动原有main.py的结构,可以通过pytest的monkeypatch模拟标准输入、capsys捕获打印结果来完成测试。
测试用例代码如下:
# test_main.py import pytest import importlib import main def test_max_occurrence_once(monkeypatch, capsys): # 模拟输入序列 1、7、9、0 input_seq = iter(["1", "7", "9", "0"]) monkeypatch.setattr("builtins.input", lambda: next(input_seq)) # 重新加载触发main模块的入口逻辑 importlib.reload(main) # 捕获打印输出 output = capsys.readouterr().out.strip() assert int(output) == 1 def test_max_occurrence_twice(monkeypatch, capsys): # 模拟输入序列 1、3、3、1、0 input_seq = iter(["1", "3", "3", "1", "0"]) monkeypatch.setattr("builtins.input", lambda: next(input_seq)) importlib.reload(main) output = capsys.readouterr().out.strip() assert int(output) == 2
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

