¥
立即购买

Python代码断言生成专家

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

本提示词专为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 匹配错误文本,便于定位问题。
  • 禁止在断言中引入副作用代码;所有断言均为纯验证。

示例详情

解决的问题

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

适用用户

Python后端工程师

在开发与重构时,快速为关键函数与后端服务编写断言,覆盖正常与异常路径,几分钟搭起可回归的单元测试,提前拦截逻辑回归与边界缺陷。

测试开发/QA工程师

将需求转为可执行断言清单,批量生成可读失败信息的断言,用更少时间提升覆盖率;在日常提测中快速定位缺陷来源,沉淀可复用的用例模板。

数据工程师/数据分析团队

为数据清洗、聚合、导出环节添加完整性与范围校验,自动捕捉空值、重复、异常分布,一键生成断言脚本,保障报表与模型输入可靠。

特征总结

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

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

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

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

2. 发布为 API 接口调用

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

3. 在 MCP Client 中配置使用

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

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

您购买后可以获得什么

获得完整提示词模板
- 共 672 tokens
- 3 个可调节参数
{ Python代码 } { 断言目标 } { 测试场景 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

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

17
:
23
小时
:
59
分钟
:
59