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

Python代码断言生成专家

👁️ 71 次查看
📅 Dec 10, 2025
💡 核心价值: 本提示词专为Python开发场景设计,能够智能分析代码逻辑并生成精准的断言语句。通过系统化的代码审查、逻辑分析、断言设计和验证流程,确保生成的断言既符合代码功能需求,又能有效捕获潜在错误。特别适用于单元测试开发、代码质量提升和自动化测试场景,帮助开发者快速构建可靠的测试用例,提升代码健壮性和可维护性。

🎯 可自定义参数(3个)

Python代码
需要添加断言的Python代码片段
断言目标
断言的主要验证目标
测试场景
代码测试的具体场景

🎨 效果示例

代码分析摘要

  • 函数 chunk_text(text, max_len, overlap=0) 将字符串按最大长度 max_len 切分为若干块,并在相邻块之间保留 overlap 个字符的重叠。
  • 输入约束:
    • text 必须为 str,否则抛 TypeError('text must be str')
    • 参数窗口合法性:max_len >= 1,overlap >= 0 且 overlap < max_len,否则抛 ValueError('invalid window params')
  • 行为:
    • 空字符串在参数合法时返回 []
    • 每个分块通过 strip 去除首尾空白
    • 最后一个块必定覆盖到原串末尾(end == n)
    • 步进为 i = end - overlap
  • 关键边界点:
    • 参数边界:max_len=1,overlap=0,overlap=max_len-1
    • 文本边界:空串、长度小于/等于/刚超过 max_len
    • 重叠正确性:相邻块的重叠段一致
    • 去空白影响:块可能为空字符串;内部空白需保留

断言设计思路

  • 参数校验断言:确保异常类型和消息正确;覆盖非法和合法边界值。
  • 返回值断言:空文本返回 [];短文本返回单块;各块长度不超过 max_len。
  • 重叠一致性断言:对于无空白干扰的文本,验证相邻块的重叠段相等。
  • 极限重叠断言:overlap=max_len-1 应产生滑动窗口步长为 1 的预期块序列。
  • 去空白断言:验证 strip 行为仅移除首尾空白,不改变内部空白;允许出现空块。
  • 计数公式断言:在无首尾空白干扰时,验证块数量与理论值一致,防止循环或步进错误。
  • 类型与长度性质断言:所有块为 str,长度均 <= max_len,作为回归的基本不变量。

生成的断言代码

import math
import pytest

def chunk_text(text, max_len, overlap=0):
    '''
    Split text into chunks of length <= max_len with character overlap.
    - Return list of strings
    - Empty text -> []
    - Raise ValueError if max_len < 1 or overlap < 0 or overlap >= max_len
    - Preserve all characters; trim whitespace around each chunk
    '''
    if not isinstance(text, str):
        raise TypeError('text must be str')
    if max_len < 1 or overlap < 0 or overlap >= max_len:
        raise ValueError('invalid window params')
    if not text:
        return []
    chunks = []
    i = 0
    n = len(text)
    while i < n:
        end = min(i + max_len, n)
        chunk = text[i:end].strip()
        chunks.append(chunk)
        if end == n:
            break
        i = end - overlap
    return chunks


def expected_chunk_count(n, max_len, overlap):
    """用于断言块数量的理论值(不考虑 strip 带来的空块/空白变化)。"""
    if n == 0:
        return 0
    if n <= max_len:
        return 1
    step = max_len - overlap
    return math.ceil((n - max_len) / step) + 1


def test_param_validation():
    # 类型错误
    with pytest.raises(TypeError, match='text must be str'):
        chunk_text(123, 5)
    with pytest.raises(TypeError, match='text must be str'):
        chunk_text(None, 5)

    # 窗口参数非法
    with pytest.raises(ValueError, match='invalid window params'):
        chunk_text("abc", 0)  # max_len < 1
    with pytest.raises(ValueError, match='invalid window params'):
        chunk_text("abc", 5, -1)  # overlap < 0
    with pytest.raises(ValueError, match='invalid window params'):
        chunk_text("abc", 5, 5)  # overlap >= max_len

    # 合法边界值
    assert chunk_text("a", 1, 0) == ["a"], "max_len=1, overlap=0 应产生单块"
    assert chunk_text("", 1, 0) == [], "空文本且参数合法应返回空列表"


def test_empty_text_returns_empty():
    assert chunk_text("", 5) == [], "空文本返回空列表(参数合法)"


def test_short_and_exact_length_text():
    # 短于 max_len -> 单块
    assert chunk_text("abc", 5, 0) == ["abc"], "短文本应返回单块,且内容被 strip"
    # 等于 max_len -> 单块
    assert chunk_text("abcde", 5, 0) == ["abcde"], "文本长度等于 max_len 应返回单块"
    # 带首尾空白的短文本 -> strip 生效
    assert chunk_text("  abc  ", 10, 0) == ["abc"], "块应移除首尾空白"


def test_basic_chunking_no_overlap():
    text = "abcdefgh"
    max_len = 3
    overlap = 0
    chunks = chunk_text(text, max_len, overlap)
    assert chunks == ["abc", "def", "gh"], "无重叠时分块应按固定步长推进"
    assert all(isinstance(c, str) for c in chunks), "所有块类型应为 str"
    assert all(len(c) <= max_len for c in chunks), "所有块长度应 <= max_len"
    # 最后一块应包含文本的最后一个非空白字符
    assert chunks[-1][-1] == text[-1], "最后一块应包含原文本末尾字符"


def test_chunking_with_overlap():
    text = "abcdefgh"
    max_len = 4
    overlap = 2
    chunks = chunk_text(text, max_len, overlap)
    assert chunks == ["abcd", "cdef", "efgh"], "重叠窗口应产生预期序列"
    # 重叠一致性:相邻块交叠部分相等
    for i in range(len(chunks) - 1):
        tail = chunks[i][-overlap:]
        head = chunks[i + 1][:overlap]
        assert tail == head, f"第{i}块尾部与第{i+1}块头部的重叠应一致"
    assert all(len(c) <= max_len for c in chunks), "所有块长度应 <= max_len"


def test_maximal_overlap_step_one():
    text = "abcdef"
    max_len = 3
    overlap = 2  # 极限重叠:步长为 1
    chunks = chunk_text(text, max_len, overlap)
    assert chunks == ["abc", "bcd", "cde", "def"], "极限重叠应产生滑动窗口步长为 1 的序列"
    # 重叠一致性
    for i in range(len(chunks) - 1):
        assert chunks[i][-2:] == chunks[i + 1][:2], "相邻块的两个字符重叠应一致"


def test_trim_behavior_and_possible_empty_chunks():
    text = "  a b  c  "
    max_len = 3
    overlap = 1
    chunks = chunk_text(text, max_len, overlap)
    # 预期分块(分析 strip 后的结果)
    assert chunks == ["a", "a b", "b", "c", ""], "strip 应移除首尾空白但保留内部空白,尾部可能产生空块"
    # 所有块应已 strip(无首尾空白)
    for c in chunks:
        assert c == c.strip(), "每个块应无首尾空白"
    # 内部空白保留(中间块应包含空格)
    assert "a b" in chunks, "内部空白应被保留"
    # 长度约束
    assert all(len(c) <= max_len for c in chunks), "所有块长度应 <= max_len"


def test_expected_chunk_count_formula():
    text = "abcdefghij"  # 长度 10,末尾非空白,便于计数断言
    max_len = 4
    overlap = 1
    chunks = chunk_text(text, max_len, overlap)
    expected = expected_chunk_count(len(text), max_len, overlap)
    assert len(chunks) == expected, "块数量应符合理论计数公式(无首尾空白干扰场景)"


def test_type_and_length_properties_regression():
    # 多样文本场景下的基本性质断言(回归用)
    samples = [
        ("  hello  world  ", 5, 2),
        ("xyz", 2, 1),
        (" " * 8, 3, 1),       # 全空白文本,strip 后可能出现空块
        ("123456789", 9, 8),   # overlap = max_len-1
    ]
    for text, max_len, overlap in samples:
        chunks = chunk_text(text, max_len, overlap)
        assert all(isinstance(c, str) for c in chunks), "所有块类型应为 str"
        assert all(len(c) <= max_len for c in chunks), "所有块长度应 <= max_len"
        # 空文本的特殊回归
        if text == "":
            assert chunks == [], "空文本应返回空列表"

断言说明

  • test_param_validation
    • 验证 TypeError/ValueError 的触发条件与错误消息,覆盖非法边界:max_len<1、overlap<0、overlap>=max_len。
    • 验证合法边界:max_len=1、overlap=0。
  • test_empty_text_returns_empty
    • 确认空文本在参数合法时返回 []。
  • test_short_and_exact_length_text
    • 文本长度短于/等于 max_len 时应返回单块;且块内容被 strip(去首尾空白)。
  • test_basic_chunking_no_overlap
    • 无重叠情况下的分块序列正确;类型与长度不变量;最后一块包含原文本末尾字符。
  • test_chunking_with_overlap
    • 有重叠的基本序列正确;相邻块的重叠段一致,确保步进 i = end - overlap 正确。
  • test_maximal_overlap_step_one
    • 覆盖极限重叠 overlap=max_len-1,验证产生步长为 1 的滑动窗口序列以及重叠一致性。
  • test_trim_behavior_and_possible_empty_chunks
    • 验证 strip 行为:仅移除首尾空白,内部空白保留;可能产生空字符串块;所有块长度满足约束。
  • test_expected_chunk_count_formula
    • 在无首尾空白干扰的文本上,块数量符合理论公式,防止循环或步进错误的回归。
  • test_type_and_length_properties_regression
    • 多样样本的基本不变量断言(类型、长度),提升回归覆盖度;覆盖特殊参数组合如 overlap=max_len-1 和全空白文本。

使用建议

  • 测试框架建议使用 pytest,将上述代码保存为 tests/test_chunk_text.py;运行 pytest 即可。
  • 若函数定义已存在于项目模块中,建议在测试文件中从目标模块导入 chunk_text,避免重复定义。
  • 在增加回归样例时:
    • 优先选择能体现边界的输入(空串、极限重叠、长度恰好等于/略大于 max_len)。
    • 若需验证重叠内容一致性,选择不含首尾空白的文本以避免 strip 干扰。
  • 断言信息尽量明确,出现失败时能快速定位是参数校验、分块逻辑、重叠、或 strip 行为的问题。
  • 禁止在断言中包含副作用代码(如修改全局状态);如需计算期望值,可使用纯函数(如 expected_chunk_count)。

代码分析摘要

  • 该函数用于清洗用户提供的文件名,保证保存时安全。
  • 核心逻辑:
    • 非字符串输入直接抛出 TypeError。
    • 去除首尾空白;若变为空,则返回默认值 default。
    • 若含有路径分隔符 '/'、'\' 或出现子串 '..',返回默认值 default。
    • 对每个字符仅允许 [A-Za-z0-9.-],其他字符逐个替换为 ''。
    • 清洗后的长度超出 max_len 时,返回 default。
    • 若清洗后以 '.' 开头,去掉所有前导 '.' 并在最前面加 '_',避免隐藏文件。
  • 安全测试关注点:
    • 路径穿越与分隔符拦截。
    • 非法字符替换。
    • 长度限制与隐藏文件防护。
    • 异常类型与消息的正确性。

断言设计思路

  • 异常处理:
    • 针对非 str 类型输入,使用断言验证抛出 TypeError 且错误消息匹配,保证异常一致性。
  • 安全场景:
    • 包含路径分隔符与父目录引用 '..' 的输入一律返回默认值,避免路径穿越。
    • 非法字符(空格、控制字符、标点、emoji、非 ASCII 字母)应被替换为 '_',逐字符验证替换结果。
    • 隐藏文件(以 '.' 开头)应转换为 '_' 前缀,覆盖单个点、多点和仅点的边界情况。
    • 长度边界:恰好等于 max_len 的有效输入应通过;超过则返回默认值。覆盖 max_len=0 和负数的异常边界。
    • 去除首尾空白后变空应返回默认值;验证默认参数自定义场景。
  • 断言表达尽量简洁,出现错误时提供明确提示信息;异常断言使用匹配文本,返回值断言注明输入与期望。

生成的断言代码

import re
import pytest

SAFE_CHAR = re.compile(r'^[A-Za-z0-9._-]$')

def sanitize_filename(name, max_len=64, default='file.txt'):
    '''
    Return a safe filename for saving user-provided names.
    Rules:
    - Type must be str; else raise TypeError
    - Strip surrounding spaces
    - If empty after strip -> return default
    - Reject path separators '/' '\\' and parent refs '..' -> return default
    - Replace illegal characters with '_' (allow letters, digits, '.', '_', '-')
    - If result longer than max_len -> return default
    - Prevent hidden files: leading '.' becomes '_'
    '''
    if not isinstance(name, str):
        raise TypeError('name must be str')
    name = name.strip()
    if not name:
        return default
    if '/' in name or '\\' in name or '..' in name:
        return default
    cleaned = ''.join(c if SAFE_CHAR.match(c) else '_' for c in name)
    if len(cleaned) > max_len:
        return default
    if cleaned.startswith('.'):
        cleaned = '_' + cleaned.lstrip('.')
    return cleaned


def test_type_error_for_non_str_inputs():
    non_str_cases = [None, 123, 3.14, True, b'abc', ['x'], {'name': 'x'}]
    for val in non_str_cases:
        with pytest.raises(TypeError, match='name must be str'):
            sanitize_filename(val)


def test_empty_after_strip_returns_default():
    for name in ["", " ", " \t\n "]:
        assert sanitize_filename(name) == "file.txt", "Empty after strip should return default"


def test_reject_path_separators_and_parent_refs():
    bad_names = [
        "a/b",
        "a\\b",
        "../secret",
        "/etc/passwd",
        "folder\\name",
        "a..b",  # 任意出现 '..' 都触发默认
    ]
    for name in bad_names:
        assert sanitize_filename(name) == "file.txt", f"Invalid path input '{name}' should return default"


def test_illegal_chars_are_replaced_with_underscore():
    cases = {
        "file name!.txt": "file_name_.txt",
        "data\tset\n.csv": "data_set_.csv",
        "🔥notes:2025?.md": "___notes_2025_.md",
        "report(β).pdf": "report___.pdf",
    }
    for name, expected in cases.items():
        assert sanitize_filename(name) == expected, f"Illegal chars in '{name}' should be replaced"


def test_hidden_file_leading_dot_is_prevented():
    cases = {
        ".bashrc": "_bashrc",
        "...env": "_env",
        ".": "_",
        "...123": "_123",
    }
    for name, expected in cases.items():
        assert sanitize_filename(name) == expected, f"Hidden file '{name}' should be made visible"


def test_length_limit_default_64():
    assert sanitize_filename("a" * 64) == "a" * 64, "Length equal to max_len should be allowed"
    assert sanitize_filename("a" * 65) == "file.txt", "Length greater than max_len should return default"


def test_length_limit_custom_max_len():
    assert sanitize_filename("abc", max_len=3) == "abc", "Length equal to custom max_len should pass"
    assert sanitize_filename("abcd", max_len=3) == "file.txt", "Exceeds custom max_len -> default"


def test_max_len_zero_and_negative():
    assert sanitize_filename("abc", max_len=0) == "file.txt", "max_len=0 should always return default for non-empty"
    assert sanitize_filename("abc", max_len=-1) == "file.txt", "Negative max_len should return default"


def test_default_parameter_is_respected():
    assert sanitize_filename("   ", default="untitled") == "untitled", "Empty after strip should use custom default"
    assert sanitize_filename("/bad", default="untitled") == "untitled", "Invalid path should use custom default"


def test_allowed_characters_are_preserved():
    name = "good-Name_1.txt"
    assert sanitize_filename(name) == name, "Allowed characters should be preserved"
    name2 = "AZaz09._-"
    assert sanitize_filename(name2) == name2, "Allowed ASCII set should pass unchanged"


def test_strip_surrounding_spaces_only():
    assert sanitize_filename("   my.txt   ") == "my.txt", "Should strip surrounding spaces"


def test_unicode_letters_are_replaced():
    assert sanitize_filename("你好.txt") == "__.txt", "Non-ASCII letters should be replaced by '_' while keeping extension"


def test_path_separators_do_not_get_sanitized_but_defaulted():
    assert sanitize_filename("a/b.txt") == "file.txt", "Slash must force default, not underscore replacement"
    assert sanitize_filename("a\\b.txt") == "file.txt", "Backslash must force default, not underscore replacement"

断言说明

  • test_type_error_for_non_str_inputs:验证异常情况处理,确保非字符串输入一致抛出 TypeError,且错误信息为“name must be str”。
  • test_empty_after_strip_returns_default:验证首尾空白清理后为空的场景返回默认值,覆盖空字符串与仅空白字符。
  • test_reject_path_separators_and_parent_refs:安全测试,任何包含 '/'、'\' 或 '..' 的输入直接返回默认值,阻止路径穿越。
  • test_illegal_chars_are_replaced_with_underscore:验证非法字符替换逻辑(空格、控制字符、标点、emoji、非 ASCII 字符),逐字符替换为下划线。
  • test_hidden_file_leading_dot_is_prevented:验证隐藏文件防护逻辑,多个前导点全部移除并加下划线前缀,特殊边界“.”返回“_”。
  • test_length_limit_default_64:验证默认长度边界,恰等于 64 通过,超过则默认化。
  • test_length_limit_custom_max_len:验证自定义 max_len 下的边界行为。
  • test_max_len_zero_and_negative:异常边界测试,max_len=0 或负数在当前实现下会导致返回默认值且不抛异常。
  • test_default_parameter_is_respected:验证 default 参数的传递与生效。
  • test_allowed_characters_are_preserved:确保合法字符集不被误改。
  • test_strip_surrounding_spaces_only:确认仅去除首尾空白,内容不被误改。
  • test_unicode_letters_are_replaced:确保非 ASCII 字符被替换,扩展名保留。
  • test_path_separators_do_not_get_sanitized_but_defaulted:确认包含路径分隔符不会替换为下划线,而是直接返回默认值(更安全)。

使用建议

  • 推荐使用 pytest 运行以上测试:在项目根目录执行命令 “pytest -q”。
  • 将测试文件命名为 test_sanitize_filename.py 并与源代码函数在同一包内,或通过正确导入路径引用函数。
  • 测试覆盖重点在异常处理与安全拦截逻辑;如需进一步提升覆盖率,可添加:
    • 模糊测试:随机生成包含多种非法字符的长字符串,验证长度与替换规则。
    • 平台差异测试:在不同 OS 上验证路径分隔符输入行为一致(当前实现为与平台无关的拦截)。
  • 保持断言信息简洁明确,异常断言使用 match 匹配错误文本,便于定位问题。
  • 禁止在断言中引入副作用代码;所有断言均为纯验证。

示例详情

📖 如何使用

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

✅ 特性总结

一键解析Python代码逻辑,定位关键验证点,自动给出应覆盖的断言清单。
面向正常与边界场景,自动生成清晰易读的断言语句,减少疏漏与误判风险。
同步输出断言设计思路与原因说明,支撑团队评审与交接,减少沟通成本与误解。
按业务目标定制断言重点,兼顾结果正确性、状态变化与异常行为的全面校验。
提供可直接粘贴的断言代码与使用建议,显著缩短单元测试编写与维护时间。
重构后一键回归校验,快速锁定不一致行为,及时暴露隐藏问题,增强发布信心。
覆盖数据处理链路的完整性检查,捕捉空值、重复、越界等异常,确保结果可靠。
兼容主流测试框架写法,输出统一风格断言,轻松融入现有仓库与协作流程。
失败信息明确可读,定位原因更直观,减少排查往返,显著提升调试与修复效率。
给出插入位置与替换建议,避免副作用与干扰,并一次集成即可稳定运行与复用。

🎯 解决的问题

面向研发与测试团队,快速把“代码+测试意图”转化为可直接落地的断言方案:自动识别关键校验点,生成清晰易读的断言,覆盖正常与边界情况,并附带解释与使用建议。帮助你显著缩短单测编写时间、提升覆盖率与可维护性,降低回归风险,在重构守护、接口校验、数据处理验证等场景中稳定输出专业结果,促进从试用到团队化付费的效率提升。

🕒 版本历史

当前版本
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
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...
📋
提示词复制
在当前页面填写参数后直接复制: