¥
立即购买

Python单元测试生成专家

0 浏览
0 试用
0 购买
Dec 10, 2025更新

本提示词专为Python开发场景设计,能够根据用户提供的Python函数自动生成高质量单元测试代码。通过系统化的分析流程,确保测试用例覆盖函数的核心功能、边界条件和异常情况。生成的测试代码符合Python单元测试最佳实践,包含清晰的断言说明和必要的测试固件设置,帮助开发者提升代码质量和测试效率。

以下为针对 summarize_text 函数的完整测试设计与实现,基于 pytest,覆盖正常流程、边界条件与异常场景,确保测试代码可读、可维护且可直接运行。

  1. 函数分析摘要
  • 功能:从输入文本中按句末标点(. ! ? 。 ! ?)切分句子,去重(忽略大小写与空白差异),按原始顺序选择前 max_sentences 个句子,必要时再受 max_chars 限制,输出结果用单空格连接。
  • 参数与校验:
    • text: 必须为 str,否则 TypeError
    • max_sentences: 必须为 int 且 >= 1,否则 ValueError
    • max_chars: None 或 int 且 >= 10,否则 ValueError
  • 关键行为:
    • 折叠空白为单空格并去除首尾空白
    • 以中英文句末标点切分;连续标点会产生独立的标点句(如 Wow!! -> "Wow!" 和 "!")
    • 去重时忽略大小写与空白差异
    • 当启用 max_chars 时,逐句尝试加入,确保不超过上限;若第一句已超过上限,返回空字符串
  1. 测试框架选择
  • 选择 pytest:
    • 简洁的断言与参数化能力,便于设计大量边界用例
    • 更友好的失败信息与插件生态(如 pytest-cov 用于覆盖率)
    • 适合本函数的多场景与多输入组合测试
  1. 测试用例详情
  • 参数校验(异常)
    • 非 str 的 text(None、数字、bytes)→ TypeError
    • 非法的 max_sentences(非 int、0、负数)→ ValueError
    • 非法的 max_chars(非 int、<10)→ ValueError
  • 空文本与空白文本
    • '' 或仅空白(含换行、制表)→ 返回 ''
  • 基本功能与顺序保持
    • 示例用例:'今天很冷!但是太阳很好。We still go hiking? 还是要出门。'
      • max_sentences=2 → '今天很冷! We still go hiking?'
      • 默认(3)→ '今天很冷! 但是太阳很好。 We still go hiking?'
  • 末尾无标点句子
    • 'No punctuation at end' → 'No punctuation at end'
  • 空白规范化
    • 'Hi \n\n there!\tHow are\tyou?\nGood.' → 'Hi there! How are you? Good.'
  • 去重(忽略大小写与空白)
    • 'Hello world! hello world! HELLO WORLD!' → 'Hello world!'
  • 连续标点分句(边界)
    • 'Wow!! Wow!' → 'Wow! !'
  • max_sentences 限制在去重后的序列上生效
    • 'A. A. B. C.' 且 max_sentences=3 → 'A. B. C.'
  • max_chars 行为
    • 精确边界:'abcd. ef. ghi.' 且 max_chars=9 → 'abcd. ef.'
    • 第一句已超过上限:'abcdefghij.' 且 max_chars=10 → ''
    • 部分选择:'abcd. efghi. jk.'
      • max_chars=12 → 'abcd. efghi.'
      • max_chars=11 → 'abcd.'
  • Unicode/Emoji 与中文标点
    • '今天天气☀️很好!我们去🏖️吗?好呀' → '今天天气☀️很好! 我们去🏖️吗? 好呀'
  • 单一标点句
    • '.' → '.'
  1. 完整测试代码 说明:为保证测试独立可运行,以下测试文件内直接包含被测函数实现。实际项目中建议从目标模块导入 summarize_text。
# test_summarize_text.py
import pytest

def summarize_text(text: str, max_sentences: int = 3, max_chars: int | None = None) -> str:
    '''
    概要: 从给定文本中提取若干关键句,保持原始顺序。
    适用: 中英文与混合标点文本,保证输出可读性。
    参数:
      - text: 原文,支持包含换行、emoji与中文标点
      - max_sentences: 最多包含的句子数,>=1
      - max_chars: 可选,最终文本的最大字符数(不截断句中词)
    行为:
      1. 规范空白,将连续空白折叠为单一空格。
      2. 以 . ! ? 。 ! ? 作为句末符进行切分,保留标点。
      3. 去除重复句(大小写与空白差异视为同句)。
      4. 按顺序选取不超过 max_sentences 的句子;若设置 max_chars,
         在不破坏已加入句子的前提下尽量满足限制。
    例子:
      输入: '今天很冷!但是太阳很好。We still go hiking? 还是要出门。'
      输出(2句): '今天很冷! We still go hiking?'
    '''
    if not isinstance(text, str):
        raise TypeError('text must be str')
    if not isinstance(max_sentences, int) or max_sentences < 1:
        raise ValueError('max_sentences must be >= 1')
    if max_chars is not None:
        if not isinstance(max_chars, int) or max_chars < 10:
            raise ValueError('max_chars must be None or >= 10')
    import re
    norm = re.sub(r'\s+', ' ', text.strip())
    if not norm:
        return ''
    endings = set('。!?.!?')
    sentences = []
    buf = []
    for ch in norm:
        buf.append(ch)
        if ch in endings:
            s = ''.join(buf).strip()
            if s:
                sentences.append(s)
            buf = []
    if buf:
        tail = ''.join(buf).strip()
        if tail:
            sentences.append(tail)
    seen = set()
    unique = []
    for s in sentences:
        key = re.sub(r'\s+', ' ', s).casefold()
        if key not in seen:
            seen.add(key)
            unique.append(s)
    selected = unique[:max_sentences]
    if max_chars is not None:
        out = []
        curr = 0
        for s in selected:
            candidate = ((' ' if out else '') + s)
            if curr + len(candidate) <= max_chars:
                out.append(s)
                curr += len(candidate)
            else:
                break
        return ' '.join(out)
    return ' '.join(selected)


# ----------------- Parameter validation tests -----------------

@pytest.mark.parametrize("bad_text", [None, 123, 3.14, b"bytes"])
def test_invalid_text_type_raises_typeerror(bad_text):
    with pytest.raises(TypeError):
        summarize_text(bad_text)

@pytest.mark.parametrize("bad_ms", [0, -1, 1.5, "2"])
def test_invalid_max_sentences_raises_valueerror(bad_ms):
    with pytest.raises(ValueError):
        summarize_text("ok.", max_sentences=bad_ms)

@pytest.mark.parametrize("bad_mc", [9, "100", 0, -5, 3.14])
def test_invalid_max_chars_raises_valueerror(bad_mc):
    with pytest.raises(ValueError):
        summarize_text("ok.", max_chars=bad_mc)

def test_max_chars_none_is_ok():
    assert summarize_text("a.") == "a."
    assert summarize_text("a.", max_chars=None) == "a."


# ----------------- Empty and whitespace-only input -----------------

@pytest.mark.parametrize("txt", ["", "   ", "\n\t  \n"])
def test_empty_or_whitespace_only_returns_empty(txt):
    assert summarize_text(txt) == ""


# ----------------- Core behavior and ordering -----------------

def test_spec_example_two_sentences():
    text = "今天很冷!但是太阳很好。We still go hiking? 还是要出门。"
    out = summarize_text(text, max_sentences=2)
    assert out == "今天很冷! We still go hiking?"

def test_default_max_sentences_three():
    text = "今天很冷!但是太阳很好。We still go hiking? 还是要出门。"
    out = summarize_text(text)  # default 3
    assert out == "今天很冷! 但是太阳很好。 We still go hiking?"

def test_tail_without_terminal_punctuation_is_included():
    assert summarize_text("No punctuation at end") == "No punctuation at end"


# ----------------- Whitespace normalization -----------------

def test_whitespace_normalization_across_spaces_tabs_newlines():
    text = "Hi  \n\n there!\tHow are\tyou?\nGood."
    out = summarize_text(text)
    assert out == "Hi there! How are you? Good."


# ----------------- Deduplication (case/whitespace-insensitive) -----------------

def test_deduplication_case_and_whitespace_insensitive():
    text = "Hello   world! hello world! HELLO WORLD!"
    out = summarize_text(text, max_sentences=5)
    assert out == "Hello world!"


# ----------------- Edge: consecutive punctuations -----------------

def test_consecutive_punctuations_create_standalone_punct_sentence():
    text = "Wow!! Wow!"
    out = summarize_text(text, max_sentences=5)
    # Splits into ["Wow!", "!", "Wow!"] then dedup -> ["Wow!", "!"]
    assert out == "Wow! !"


# ----------------- max_sentences with duplicates -----------------

def test_max_sentences_respects_unique_sentences():
    text = "A. A. B. C."
    out = summarize_text(text, max_sentences=3)
    assert out == "A. B. C."


# ----------------- max_chars behavior -----------------

def test_max_chars_exact_boundary_and_not_exceed():
    text = "abcd. ef. ghi."
    # lengths: "abcd."=5, " ef."=4, " ghi."=5
    out = summarize_text(text, max_sentences=5, max_chars=9)
    assert out == "abcd. ef."
    out2 = summarize_text(text, max_sentences=5, max_chars=8)
    assert out2 == "abcd."

def test_max_chars_first_sentence_too_long_returns_empty():
    # "abcdefghij." length = 11 (> 10), with max_chars=10, nothing fits
    text = "abcdefghij."
    out = summarize_text(text, max_sentences=3, max_chars=10)
    assert out == ""

def test_max_chars_partial_selection_two_vs_one():
    text = "abcd. efghi. jk."
    # "abcd."=5, " efghi."=7 -> 12 total fits, so two sentences if max_chars=12
    out = summarize_text(text, max_sentences=3, max_chars=12)
    assert out == "abcd. efghi."
    # With max_chars=11, only the first fits
    out2 = summarize_text(text, max_sentences=3, max_chars=11)
    assert out2 == "abcd."


# ----------------- Unicode/Emoji and Chinese punctuation -----------------

def test_unicode_emoji_and_chinese_punctuation():
    text = "今天天气☀️很好!我们去🏖️吗?好呀"
    out = summarize_text(text, max_sentences=3)
    assert out == "今天天气☀️很好! 我们去🏖️吗? 好呀"


# ----------------- Single punctuation as sentence -----------------

def test_single_punctuation_sentence():
    assert summarize_text(".") == "."
  1. 测试说明
  • 关于连续标点:该实现会把连续的句末标点切分为多个句子,例如 "Wow!!" 被解析为 "Wow!" 和 "!",这与常规自然语言处理的“多个感叹号视为同一句”不同。测试中明确验证了此行为(test_consecutive_punctuations_create_standalone_punct_sentence),以与实现保持一致。
  • max_chars 的计算包含句子间的空格:当加入第二句时,候选长度会在句首额外计算一个空格,这一点在边界测试中被覆盖(test_max_chars_exact_boundary_and_not_exceed、test_max_chars_partial_selection_two_vs_one)。
  • 覆盖率建议:运行 pytest --maxfail=1 -q;如需覆盖率报告,安装 pytest-cov 并运行 pytest --cov=. --cov-report=term-missing。建议重点关注分句、去重和 max_chars 分支路径的覆盖。
  • Python 版本:函数签名使用了 PEP 604(int | None)语法,需 Python 3.10+。在低版本下请将类型提示改为 Optional[int] 或移除类型联合操作符以运行测试。

示例详情

解决的问题

以“更快、更稳、更省心”为核心价值,帮助研发团队在数分钟内生成可直接运行的 Python 单元测试:

  • 全面覆盖主流程、边界与异常,显著降低遗漏风险
  • 将测试从“经验活”变为“有章可循”的标准流程,统一团队输出风格
  • 作为重构与持续集成的安全网,提前暴露潜在缺陷,减少回滚与线上事故
  • 新人也能写出专家级单测,释放骨干精力,整体提升研发效率
  • 自由选择 unittest 或 pytest,并按需控制详略程度,兼顾多项目与多阶段需求
  • 试用期快速见效,付费后可长期沉淀团队规范与最佳实践,形成可复制的质量能力

适用用户

Python后端开发工程师

新功能提交前,快速生成覆盖正常、边界与异常的单元测试;补齐遗留模块测试,提升评审通过率;避免上线后低级回归,稳住接口行为。

测试工程师/QA

基于函数说明一键产出成体系用例与断言说明;识别覆盖盲区并补齐关键路径;沉淀可复用测试模板,提升回归效率。

技术负责人/Tech Lead

用统一的测试规范把控质量;为流水线准备好可直接运行的测试,缩短迭代周期;在人员紧张时也能保持稳定交付。

特征总结

智能解析函数逻辑,一键生成覆盖正常、边界与异常的测试用例,减少遗漏风险。
一键选择主流测试框架,自动匹配项目风格与断言写法,测试代码即刻可用。
生成可直接运行的测试文件,内含清晰断言与必要准备,避免外部依赖导致不稳定。
自动识别边界值与异常路径,并提示覆盖盲区,帮助快速补齐关键测试。
针对遗留与重构场景,批量补齐缺失测试,降低回归风险,保障版本发布安全。
同步产出测试说明与预期结果,便于团队协作评审与知识沉淀,复用更高效。
按需切换基础到深入测试粒度,兼顾开发自测与持续集成速度,性能与覆盖平衡。
支持以测促开,先出用例再编码,规范团队流程,提升可维护性与交付质量。
为持续集成准备好标准化结构与命名,轻松接入流水线,缩短提测到发布周期。
遵循测试编码规范,自动去重去冗余,结构清晰简洁,长期维护成本更友好。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

AI 提示词价格
¥20.00元
先用后买,用好了再付款,超安全!

您购买后可以获得什么

获得完整提示词模板
- 共 558 tokens
- 3 个可调节参数
{ Python函数代码 } { 测试框架偏好 } { 测试详细程度 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

半价获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59