×
¥
查看详情
🔥 会员专享 文生文 其它

Python单元测试生成专家

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

🎯 可自定义参数(3个)

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] 或移除类型联合操作符以运行测试。

示例详情

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

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

🎯 解决的问题

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

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

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...
📋
提示词复制
在当前页面填写参数后直接复制: