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

如何为统计数组最大值出现次数的代码编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:48:05