¥
立即购买

函数测试用例生成

208 浏览
17 试用
4 购买
Nov 19, 2025更新

本提示词专为开发者和质量保证工程师设计,能够根据函数名称、参数及预期行为自动生成结构化、可复用的后端代码测试用例。通过智能分析代码逻辑和业务场景,确保测试覆盖全面性,显著提升测试效率并降低人工编写成本。支持多种测试类型和优先级设置,适用于单元测试、集成测试等多种测试场景,帮助团队建立高质量的代码测试体系。

1) 函数基本信息

  • 函数名称:generate_summary_cn
  • 参数说明:
    • text: String,50-5000字中文正文,可含标题/正文/标点/括号/英文缩写/百分比/表格符号;需先去除多余空白后参与处理
    • target_length: Integer,目标摘要字数,取值80-180,超界需钳制到[80,180]
    • style: String,取值为“简洁”/“资讯”/“科普”,控制措辞与信息密度
    • focus_keywords: String[],0-5项,需去重后不超过5个,优先覆盖的主题词
    • language: String,固定“zh-CN”
  • 返回值类型:String(UTF-8),单段输出,中文标点规范化,无多余换行或前后空格

2) 测试场景总览

  • P0(核心功能/高风险)
    1. 正常流程:资讯风格,120字目标,包含关键词且覆盖动作事实
    2. 目标字数下限钳制:target_length=50 → 钳制到80并满足容差
    3. 目标字数上限钳制:target_length=200 → 钳制到180并满足容差
    4. 文本清洗:重复段落与广告噪声去除
    5. 英文缩写与百分比保留:如 LEO、25%
    6. 结尾不完整:合理收束,避免续写新事实,句末规范
    7. 返回值格式:单段、UTF-8可编码、无首尾空格、无换行
    8. 性能:1200字在300ms内完成,内存占用<20MB(以增量近似)
  • P1(重要但次优先) 9. 风格变体:简洁 10. 风格变体:科普 11. 语言固定:zh-CN 正常通过 12. 语言非法值:传入非 zh-CN 亦应容错地返回中文摘要 13. 文本长度下界:50字输入可正常输出 14. 文本长度上界:5000字输入可正常输出(不强制性能断言)

3) 详细测试用例

  • 测试用例 TC01

    • 测试名称:正常流程_资讯风格_120字_包含关键词与动作
    • 前置条件:构造约1200字科技新闻,含时间/地点/主体/动作/结果,包含关键词[“气象”,“卫星”,“轨道”]
    • 测试步骤:
      1. 调用 generate_summary_cn(text_1200, 120, "资讯", ["气象","卫星","轨道"], "zh-CN")
    • 预期结果:
      • 字数在[100,140]
      • 至少包含一个关键词(“气象”或“卫星”或“轨道”)
      • 包含动作词(如“发射”或“在轨”)
      • 单段,无换行,首尾无空格
      • 句末以“。”结束
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC02

    • 测试名称:目标字数下限钳制_50
    • 前置条件:有效文本约800字
    • 测试步骤:调用 generate_summary_cn(text, 50, "资讯", [], "zh-CN")
    • 预期结果:字数在[60,100],单段,无换行,句末“。”
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC03

    • 测试名称:目标字数上限钳制_200
    • 前置条件:有效文本约1200字
    • 测试步骤:调用 generate_summary_cn(text, 200, "资讯", [], "zh-CN")
    • 预期结果:字数在[160,200],单段,无换行,句末“。”
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC04

    • 测试名称:关键词去重与上限截断
    • 前置条件:关键词输入包含重复与超限,如["气象","卫星","轨道","卫星","在轨","发射","卫星"]
    • 测试步骤:调用 generate_summary_cn(text_1200, 120, "资讯", keywords, "zh-CN")
    • 预期结果:输出不报错;摘要至少包含去重后集合中的任一项;长度在[100,140]
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC05

    • 测试名称:文本清洗_去重与去广告
    • 前置条件:文本包含重复段落与广告语(如“点击阅读原文”“扫描二维码”)
    • 测试步骤:调用 generate_summary_cn(noisy_text, 120, "资讯", ["气象","卫星"], "zh-CN")
    • 预期结果:摘要不包含广告关键词;长度在[100,140];单段
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC06

    • 测试名称:英文缩写与百分比保留
    • 前置条件:文本核心事实仅一处出现“LEO”“25%”等
    • 测试步骤:调用 generate_summary_cn(compact_core_text, 120, "资讯", ["卫星","LEO"], "zh-CN")
    • 预期结果:摘要中包含“LEO”和“25%”;单段,长度在[100,140]
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC07

    • 测试名称:结尾不完整_合理收束并以句号结束
    • 前置条件:文本末尾被截断,语义未完
    • 测试步骤:调用 generate_summary_cn(truncated_text, 120, "资讯", ["卫星"], "zh-CN")
    • 预期结果:摘要以“。”结束,无杜撰新增事实(以不过度延展为准)
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC08

    • 测试名称:返回值格式_单段无首尾空格无换行
    • 前置条件:有效输入
    • 测试步骤:调用 generate_summary_cn(text_800, 120, "资讯", [], "zh-CN")
    • 预期结果:typeof 为 string;trim 后与原字符串长度一致;不含“\n”;可被 UTF-8 编码
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC09

    • 测试名称:性能_1200字_300ms_内存<20MB
    • 前置条件:构造稳定的1200字输入
    • 测试步骤:测量执行时间(Date.now)与 heapUsed 的增量
    • 预期结果:耗时<300ms;内存增量<20MB
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC10

    • 测试名称:风格变体_简洁
    • 前置条件:有效文本约800字
    • 测试步骤:调用 style="简洁"
    • 预期结果:非空,长度在目标±20内;单段
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC11

    • 测试名称:风格变体_科普
    • 前置条件:有效文本约800字
    • 测试步骤:调用 style="科普"
    • 预期结果:非空,长度在目标±20内;单段
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC12

    • 测试名称:语言参数固定_zh-CN
    • 前置条件:有效文本
    • 测试步骤:language="zh-CN"
    • 预期结果:返回中文摘要;格式符合规范
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC13

    • 测试名称:语言参数非法值_仍返回中文摘要
    • 前置条件:有效文本
    • 测试步骤:language="en-US"
    • 预期结果:不抛错;返回内容包含中文字符;单段
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC14

    • 测试名称:文本长度下界_50字
    • 前置条件:构造恰好约50字文本
    • 测试步骤:调用 generate_summary_cn(text_50, 80, "资讯", [], "zh-CN")
    • 预期结果:长度在[60,100];单段;不杜撰
    • 实际结果:由自动化测试运行时填充
  • 测试用例 TC15

    • 测试名称:文本长度上界_5000字
    • 前置条件:构造约5000字文本
    • 测试步骤:调用 generate_summary_cn(text_5000, 180, "资讯", [], "zh-CN")
    • 预期结果:长度在[160,200];单段;不超时(不强制300ms)
    • 实际结果:由自动化测试运行时填充
  • 可执行测试代码(Jest,TypeScript/Node.js)

// __tests__/generate_summary_cn.spec.ts
import { generate_summary_cn } from "../src/generate_summary_cn";

const CN_PERIOD = "。";

function includesOne(s: string, arr: string[]) {
  return arr.some(k => s.includes(k));
}
function isSingleParagraph(s: string) {
  return !/\r|\n/.test(s);
}
function inRange(len: number, target: number, tolerance = 20) {
  return len >= target - tolerance && len <= target + tolerance;
}
function clampTarget(t: number) {
  return Math.min(180, Math.max(80, t));
}
function hasChinese(s: string) {
  return /[\u4e00-\u9fa5]/.test(s);
}
function makeBaseParagraph(): string {
  return "【标题】新一代气象卫星发射及在轨测试进展。2025年11月18日08时36分,海南文昌航天发射场由长征七号运载火箭成功发射“天穹一号”气象卫星,进入LEO近地轨道(高度700km),由中国航天科技集团五院研制。卫星搭载X-Band载荷,成像分辨率达到10m,数据下行速率提升25%。后续开展在轨测试,验证姿态控制与热控指标。任务指挥部宣布发射圆满成功。";
}
function makeNoisyParagraph(): string {
  return makeBaseParagraph() + " 点击阅读原文了解更多,扫描二维码参与活动!重复:任务指挥部宣布发射圆满成功。";
}
function repeatToLength(seed: string, minLen: number): string {
  let s = seed;
  while (s.length < minLen) s += " " + seed;
  return s;
}
const text_1200 = (() => {
  // 包含重复段落与噪声
  const p1 = makeBaseParagraph();
  const p2 = makeNoisyParagraph();
  const corpus = (p1 + " " + p2 + " " + p1 + " " + p2);
  return repeatToLength(corpus, 1200).replace(/\s+/g, " ");
})();
const text_800 = repeatToLength(makeBaseParagraph(), 800);
const text_50  = "2025年11月,文昌成功发射气象卫星,进入轨道,任务顺利推进。";
const text_5000 = repeatToLength(makeNoisyParagraph(), 5000);

const compact_core_text = "2025年11月18日,文昌发射新一代气象卫星,进入LEO轨道,高度700km,X-Band载荷稳定,数据下行速率提升25%,在轨测试验证姿态与热控,发射圆满成功。";

describe("generate_summary_cn 基础功能与边界", () => {
  test("TC01 正常流程_资讯风格_120字_包含关键词与动作", async () => {
    const kw = ["气象","卫星","轨道"];
    const target = 120;
    const res = await generate_summary_cn(text_1200, target, "资讯", kw, "zh-CN");
    expect(typeof res).toBe("string");
    expect(isSingleParagraph(res)).toBe(true);
    expect(res.trim()).toBe(res);
    expect(inRange(res.length, target, 20)).toBe(true);
    expect(includesOne(res, kw)).toBe(true);
    expect(includesOne(res, ["发射","在轨","测试"])).toBe(true);
    expect(res.endsWith(CN_PERIOD)).toBe(true);
  });

  test("TC02 目标字数下限钳制_50→80", async () => {
    const target = 50;
    const clamped = clampTarget(target);
    const res = await generate_summary_cn(text_800, target, "资讯", [], "zh-CN");
    expect(inRange(res.length, clamped, 20)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
    expect(res.endsWith(CN_PERIOD)).toBe(true);
  });

  test("TC03 目标字数上限钳制_200→180", async () => {
    const target = 200;
    const clamped = clampTarget(target);
    const res = await generate_summary_cn(text_1200, target, "资讯", [], "zh-CN");
    expect(inRange(res.length, clamped, 20)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
    expect(res.endsWith(CN_PERIOD)).toBe(true);
  });

  test("TC04 关键词去重与上限截断", async () => {
    const kw = ["气象","卫星","轨道","卫星","在轨","发射","卫星"];
    const res = await generate_summary_cn(text_1200, 120, "资讯", kw, "zh-CN");
    expect(typeof res).toBe("string");
    expect(includesOne(res, ["气象","卫星","轨道","在轨","发射"])).toBe(true);
    expect(inRange(res.length, 120, 20)).toBe(true);
  });

  test("TC05 文本清洗_去重与去广告", async () => {
    const res = await generate_summary_cn(text_1200, 120, "资讯", ["气象","卫星"], "zh-CN");
    expect(res.includes("点击阅读原文")).toBe(false);
    expect(res.includes("扫描二维码")).toBe(false);
    expect(isSingleParagraph(res)).toBe(true);
    expect(inRange(res.length, 120, 20)).toBe(true);
  });

  test("TC06 英文缩写与百分比保留", async () => {
    const res = await generate_summary_cn(compact_core_text, 120, "资讯", ["卫星","LEO"], "zh-CN");
    expect(res.includes("LEO")).toBe(true);
    expect(res.includes("25%")).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
    expect(inRange(res.length, 120, 20)).toBe(true);
  });

  test("TC07 结尾不完整_合理收束并以句号结束", async () => {
    const truncated_text = text_800.slice(0, 600); // 人为截断
    const res = await generate_summary_cn(truncated_text, 120, "资讯", ["卫星"], "zh-CN");
    expect(res.endsWith(CN_PERIOD)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
  });

  test("TC08 返回值格式_单段无首尾空格无换行_UTF-8可编码", async () => {
    const res = await generate_summary_cn(text_800, 120, "资讯", [], "zh-CN");
    expect(typeof res).toBe("string");
    expect(res.trim()).toBe(res);
    expect(isSingleParagraph(res)).toBe(true);
    // UTF-8 可编码
    const buf = Buffer.from(res, "utf8");
    expect(buf.length).toBeGreaterThan(0);
  });

  test("TC09 性能_1200字_300ms_内存<20MB", async () => {
    jest.setTimeout(1000);
    const before = process.memoryUsage().heapUsed;
    const t0 = Date.now();
    const res = await generate_summary_cn(text_1200, 120, "资讯", ["气象","卫星","轨道"], "zh-CN");
    const t1 = Date.now();
    const after = process.memoryUsage().heapUsed;
    const delta = Math.max(0, after - before);
    expect(typeof res).toBe("string");
    expect(t1 - t0).toBeLessThan(300);
    expect(delta).toBeLessThan(20 * 1024 * 1024);
  });

  test("TC10 风格变体_简洁", async () => {
    const res = await generate_summary_cn(text_800, 120, "简洁", ["卫星"], "zh-CN");
    expect(isSingleParagraph(res)).toBe(true);
    expect(inRange(res.length, 120, 20)).toBe(true);
  });

  test("TC11 风格变体_科普", async () => {
    const res = await generate_summary_cn(text_800, 120, "科普", ["卫星"], "zh-CN");
    expect(isSingleParagraph(res)).toBe(true);
    expect(inRange(res.length, 120, 20)).toBe(true);
  });

  test("TC12 语言参数固定_zh-CN", async () => {
    const res = await generate_summary_cn(text_800, 120, "资讯", ["卫星"], "zh-CN");
    expect(hasChinese(res)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
  });

  test("TC13 语言参数非法值_仍返回中文摘要", async () => {
    const res = await generate_summary_cn(text_800, 120, "资讯", ["卫星"], "en-US" as any);
    expect(hasChinese(res)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
  });

  test("TC14 文本长度下界_50字", async () => {
    const res = await generate_summary_cn(text_50, 80, "资讯", ["卫星"], "zh-CN");
    expect(inRange(res.length, 80, 20)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
  });

  test("TC15 文本长度上界_5000字", async () => {
    const res = await generate_summary_cn(text_5000, 180, "资讯", ["气象","卫星","轨道"], "zh-CN");
    expect(inRange(res.length, 180, 20)).toBe(true);
    expect(isSingleParagraph(res)).toBe(true);
  });
});

4) 测试覆盖分析

  • 关键路径覆盖
    • 正常摘要生成:TC01
    • 目标长度钳制上下界:TC02、TC03
    • 关键词处理与优先覆盖:TC04、TC01
    • 文本清洗(去重/去广告):TC05
    • 事实保留(英文缩写/百分比):TC06
    • 不完整文本收束:TC07
    • 返回值约束(单段/无空白/UTF-8):TC08
    • 性能与内存:TC09
    • 风格参数三种取值:TC01/TC10/TC11
    • 语言固定与容错:TC12/TC13
    • 输入文本长度边界:TC14/TC15
  • 风险点说明
    • 摘要长度容差实现易波动:通过区间断言(±20)降低偶发失败风险
    • 文本清洗去广告规则差异:断言常见广告词不出现
    • 性能/内存环境敏感:以增量近似评估,防止受进程基线影响
    • 专有名词与数字保留:通过最小信息载体文本(compact_core_text)强制其成为核心

5) 执行建议

  • 测试执行顺序(推荐)
    1. 基础正确性:TC01 → TC08
    2. 性能与资源:TC09
    3. 风格与语言:TC10 → TC13
    4. 边界长度:TC14 → TC15
  • 环境要求
    • Node.js >= 18,TypeScript >= 4.9(若使用 TS)
    • 测试框架:Jest >= 29
    • 代码结构:src/generate_summary_cn.ts 实现;测试文件放置于 tests/ 目录
    • 建议本地独立进程运行,避免与其他内存密集任务并发,确保性能数据稳定

1. 函数基本信息

  • 函数名称:rewrite_text_cn
  • 参数说明:
    • source_text String:30-2000字,支持表情与中英混排
    • tone String:正式|口语|活泼|严肃|说明书
    • audience String:通用|专业|青少年
    • banned_words String[]:0-10项
    • keep_length_ratio Float:0.8-1.2
    • preserve_entities Boolean:true 时人名、地名、机构名、产品型号不可被改写
  • 返回值类型:String(单段或与原结构等价,UTF-8,中文标点与空白规范化,不追加免责声明)

2. 测试场景总览(按优先级)

  • P0(关键路径与约束)
    • 正常流程:正式+专业,禁词过滤,保留实体,长度比例合规
    • 输入校验:空白折叠、换行与列表结构保留、型号与英文缩写保留、表情安全处理
    • 返回值验证:类型为字符串、UTF-8可序列化、与原结构等价
    • 禁词校验:输出不包含 banned_words
    • 实体保留:preserve_entities=true 时名称/地名/机构/型号不变
    • 长度比例:输出长度在 0.8-1.2×原文之间
  • P1(边界与稳定性)
    • 极短文本:避免过度扩写(≤1.2×)
    • 列表与冒号结构:行数与标记数保持
    • 稳定性:同入同出结果一致(可复现)
    • 数字/日期/版本号保留
  • P2(性能与多样性)
    • 性能:500字输入在200ms内完成
    • 受众/语气多样性:专业/通用/青少年与正式/口语/活泼/严肃/说明书组合的基本验证
    • keep_length_ratio 边界值:0.8 与 1.2

3. 详细测试用例

以下每条用例包含:测试名称、前置条件、测试步骤、预期结果、实际结果(执行后填写)

  • 用例1(P0):正式+专业,禁词过滤与实体保留

    • 前置条件:preserve_entities=true;banned_words=["内测","极致"]
    • 测试步骤:
      1. 调用函数:
        • source_text="更新公告 v2.3:我们对XR-200模块进行了功耗优化,并提升了离线模式的稳定性。感谢参与内测的用户支持,这次体验将更为极致。发布日期:2025-05-01。"
        • tone="正式", audience="专业", keep_length_ratio=1.0
      2. 记录输出
    • 预期结果:
      • 输出为字符串,非空
      • 不包含 "内测"、"极致"
      • "XR-200"、"v2.3"、"2025-05-01" 原样保留
      • 输出长度在原文长度的 0.8-1.2 之间
    • 实际结果:—
  • 用例2(P0):输入空白与换行折叠,表情与混排安全

    • 前置条件:preserve_entities=true;banned_words=[]
    • 测试步骤:
      1. source_text=" 公告 :\n\nXR-200 beta 🙂 功耗 优化 \n离线模式 \n 稳定性 提升 " tone="正式", audience="通用", keep_length_ratio=1.0
      2. 记录输出
    • 预期结果:
      • 输出首尾无多余空白
      • 不存在连续两个及以上的空格或空行
      • "XR-200"、"beta"、"🙂" 保留且语义不破坏
      • 结构清晰可读
    • 实际结果:—
  • 用例3(P0):列表与冒号结构保持

    • 前置条件:preserve_entities=true;banned_words=[]
    • 测试步骤:
      1. source_text="更新内容:\n- 修复:登录异常\n- 优化:XR-200 功耗\n- 新增:离线模式" tone="说明书", audience="专业", keep_length_ratio=1.0
      2. 记录输出
    • 预期结果:
      • 行数与列表项数量保持一致(3项)
      • 每项中的冒号结构保留
      • "XR-200" 原样保留
    • 实际结果:—
  • 用例4(P1):极短文本避免过度扩写

    • 前置条件:preserve_entities=false;banned_words=[]
    • 测试步骤:
      1. source_text="紧急更新" tone="严肃", audience="通用", keep_length_ratio=1.0
    • 预期结果:
      • 输出非空
      • 输出长度不超过原文1.2倍
    • 实际结果:—
  • 用例5(P0):禁词出现在原文时必须全部过滤

    • 前置条件:preserve_entities=true;banned_words=["内测","极致"]
    • 测试步骤:
      1. source_text="本次为内测版本,追求极致体验。XR-200 已优化。" tone="正式", audience="专业", keep_length_ratio=1.0
    • 预期结果:
      • 输出不包含 "内测"、"极致"
      • "XR-200" 原样保留
      • 含义与原文等价
    • 实际结果:—
  • 用例6(P0):数字/日期/版本号保留

    • 前置条件:preserve_entities=true;banned_words=[]
    • 测试步骤:
      1. source_text="发布于 2025年11月19日 14:35 UTC+8,版本 v3.10.4(build 7890),XR-200 性能优化。" tone="正式", audience="专业", keep_length_ratio=1.0
    • 预期结果:
      • "2025年11月19日"、"14:35"、"UTC+8"、"v3.10.4"、"build 7890"、"XR-200" 原样保留
    • 实际结果:—
  • 用例7(P1):受众为专业时术语保留

    • 前置条件:preserve_entities=true;banned_words=[]
    • 测试步骤:
      1. source_text="优化 CPU 使用,改进 API 响应时间,XR-200 模块保持兼容。" tone="正式", audience="专业", keep_length_ratio=1.0
    • 预期结果:
      • "CPU"、"API"、"XR-200" 保留
      • 整体语气偏专业
    • 实际结果:—
  • 用例8(P2):preserve_entities 边界对比

    • 前置条件:banned_words=[]
    • 测试步骤:
      1. 输入相同文本两次,分别使用 preserve_entities=true 与 false: source_text="张三在上海代表 ACME 科技发布 XR-200 新版。" tone="口语", audience="通用", keep_length_ratio=1.0
      2. 记录两个输出
    • 预期结果:
      • preserve_entities=true 的输出包含原样的 "张三"、"上海"、"ACME"、"XR-200"
      • 两次输出均合规(禁词、长度比例等)
    • 实际结果:—
  • 用例9(P2):keep_length_ratio 边界值

    • 前置条件:preserve_entities=true;banned_words=[]
    • 测试步骤:
      1. 以同一 200-300 字文本,分别设置 keep_length_ratio=0.8 与 1.2
      2. 记录两个输出
    • 预期结果:
      • 两个输出长度均在原文 0.8-1.2 倍区间内
    • 实际结果:—
  • 用例10(P1):稳定性与可复现

    • 前置条件:任意合法参数
    • 测试步骤:
      1. 对同一输入调用函数两次
    • 预期结果:
      • 两次输出完全一致
    • 实际结果:—
  • 用例11(P2):性能 500 字以内 200ms

    • 前置条件:构造约500字输入;preserve_entities=true;banned_words包含2个词
    • 测试步骤:
      1. 记录开始时间
      2. 调用函数一次
      3. 记录耗时
    • 预期结果:
      • 总耗时 ≤ 200ms
      • 其他合规项同时满足
    • 实际结果:—
  • 用例12(P1):结构与冒号在多段落文本中保持

    • 前置条件:preserve_entities=true;banned_words=[]
    • 测试步骤:
      1. source_text 包含多段、多个半角/全角冒号与中英文混排清单
    • 预期结果:
      • 段落数、清单项数量、冒号结构保持
    • 实际结果:—

— 可执行测试代码(Jest,Node.js)

// 文件:tests/rewrite_text_cn.spec.js
// 运行环境:Node.js >= 18,Jest >= 29
// 假定被测函数从 ../src/rewrite_text_cn 导出:export function rewrite_text_cn(...)
const { rewrite_text_cn } = require('../src/rewrite_text_cn');

function noBannedWords(text, banned) {
  return banned.every(w => !text.includes(w));
}
function containsAllEntities(text, entities) {
  return entities.every(e => text.includes(e));
}
function ratioWithin(out, src, min = 0.8, max = 1.2) {
  const r = out.length / src.length;
  return r >= min && r <= max;
}
function noExtraSpaces(text) {
  return !/ {2,}/.test(text) && !/\n{2,}/.test(text) && text === text.trim();
}
function listItemCount(text) {
  return text.split('\n').filter(l => l.trim().startsWith('-')).length;
}
function hasAllColons(text) {
  // 支持中英文冒号
  return /:|:/.test(text);
}

describe('rewrite_text_cn 基础校验', () => {
  test('用例1:正式+专业,禁词过滤与实体保留', () => {
    const source = "更新公告 v2.3:我们对XR-200模块进行了功耗优化,并提升了离线模式的稳定性。感谢参与内测的用户支持,这次体验将更为极致。发布日期:2025-05-01。";
    const banned = ["内测","极致"];
    const out = rewrite_text_cn(source, "正式", "专业", banned, 1.0, true);
    expect(typeof out).toBe('string');
    expect(out.length).toBeGreaterThan(0);
    expect(noBannedWords(out, banned)).toBe(true);
    expect(containsAllEntities(out, ["XR-200","v2.3","2025-05-01"])).toBe(true);
    expect(ratioWithin(out, source, 0.8, 1.2)).toBe(true);
  });

  test('用例2:空白折叠、表情与混排安全', () => {
    const source = "  公告  :\n\nXR-200  beta  🙂  功耗 优化  \n离线模式 \n 稳定性 提升  ";
    const out = rewrite_text_cn(source, "正式", "通用", [], 1.0, true);
    expect(typeof out).toBe('string');
    expect(noExtraSpaces(out)).toBe(true);
    expect(out.includes("XR-200")).toBe(true);
    expect(out.includes("beta")).toBe(true);
    expect(out.includes("🙂")).toBe(true);
  });

  test('用例3:列表与冒号结构保持', () => {
    const source = "更新内容:\n- 修复:登录异常\n- 优化:XR-200 功耗\n- 新增:离线模式";
    const out = rewrite_text_cn(source, "说明书", "专业", [], 1.0, true);
    expect(typeof out).toBe('string');
    expect(listItemCount(out)).toBe(3);
    expect(hasAllColons(out)).toBe(true);
    expect(out.includes("XR-200")).toBe(true);
  });

  test('用例4:极短文本避免过度扩写', () => {
    const source = "紧急更新";
    const out = rewrite_text_cn(source, "严肃", "通用", [], 1.0, false);
    expect(typeof out).toBe('string');
    expect(out.length).toBeGreaterThan(0);
    expect(out.length).toBeLessThanOrEqual(Math.ceil(source.length * 1.2));
  });

  test('用例5:禁词出现在原文时必须全部过滤', () => {
    const source = "本次为内测版本,追求极致体验。XR-200 已优化。";
    const banned = ["内测","极致"];
    const out = rewrite_text_cn(source, "正式", "专业", banned, 1.0, true);
    expect(noBannedWords(out, banned)).toBe(true);
    expect(out.includes("XR-200")).toBe(true);
  });

  test('用例6:数字/日期/版本号保留', () => {
    const source = "发布于 2025年11月19日 14:35 UTC+8,版本 v3.10.4(build 7890),XR-200 性能优化。";
    const out = rewrite_text_cn(source, "正式", "专业", [], 1.0, true);
    ["2025年11月19日","14:35","UTC+8","v3.10.4","build 7890","XR-200"].forEach(t => {
      expect(out.includes(t)).toBe(true);
    });
  });

  test('用例7:受众为专业时术语保留', () => {
    const source = "优化 CPU 使用,改进 API 响应时间,XR-200 模块保持兼容。";
    const out = rewrite_text_cn(source, "正式", "专业", [], 1.0, true);
    ["CPU","API","XR-200"].forEach(t => expect(out.includes(t)).toBe(true));
  });

  test('用例8:preserve_entities 边界对比', () => {
    const source = "张三在上海代表 ACME 科技发布 XR-200 新版。";
    const outPreserve = rewrite_text_cn(source, "口语", "通用", [], 1.0, true);
    const outFree = rewrite_text_cn(source, "口语", "通用", [], 1.0, false);
    expect(containsAllEntities(outPreserve, ["张三","上海","ACME","XR-200"])).toBe(true);
    // outFree 不强制变更,只校验基本合规
    expect(typeof outFree).toBe('string');
    expect(ratioWithin(outFree, source, 0.8, 1.2)).toBe(true);
  });

  test('用例9:keep_length_ratio 边界值(0.8/1.2)', () => {
    const source = "我们对 XR-200 进行多项优化,包括缓存策略、并发控制与离线模式稳定性提升。此版本面向专业用户,建议尽快升级以获得更稳定的运行表现。";
    const outShort = rewrite_text_cn(source, "正式", "专业", [], 0.8, true);
    const outLong = rewrite_text_cn(source, "正式", "专业", [], 1.2, true);
    expect(ratioWithin(outShort, source, 0.8, 1.2)).toBe(true);
    expect(ratioWithin(outLong, source, 0.8, 1.2)).toBe(true);
  });

  test('用例10:稳定性与可复现', () => {
    const source = "离线模式稳定性提升,修复部分边缘场景下的连接中断问题。";
    const p = ["正式","通用",[],1.0,true];
    const out1 = rewrite_text_cn(source, ...p);
    const out2 = rewrite_text_cn(source, ...p);
    expect(out1).toBe(out2);
  });

  test('用例11:性能 500 字以内 200ms', () => {
    const paragraph = "此次版本针对 XR-200 模块进行了系统级功耗优化与缓存重构," +
      "在离线模式下显著提升稳定性,并改善了弱网环境下的重连策略与失败重试机制。" +
      "我们同步优化了日志采集与上报开销,降低 CPU 占用,缩短 API 响应延迟。" +
      "安全方面,完善了输入校验与异常隔离,确保配置变更在多区域一致生效。" +
      "同时更新了说明文档与兼容性列表,以便专业用户快速验证环境与依赖。";
    let source = paragraph;
    while (source.length < 500) source += " " + paragraph;
    source = source.slice(0, 520);

    const start = process.hrtime.bigint();
    const out = rewrite_text_cn(source, "正式", "专业", ["内测","极致"], 1.0, true);
    const end = process.hrtime.bigint();
    const elapsedMs = Number(end - start) / 1e6;
    expect(elapsedMs).toBeLessThanOrEqual(200);
    expect(typeof out).toBe('string');
    expect(noBannedWords(out, ["内测","极致"])).toBe(true);
    expect(ratioWithin(out, source, 0.8, 1.2)).toBe(true);
  });

  test('用例12:多段落与冒号结构保持', () => {
    const source = "概要:本次更新聚焦稳定性。\n详情:\n- 修复:异常重连\n- 优化:XR-200 功耗\n附注:请参考部署说明。";
    const out = rewrite_text_cn(source, "正式", "通用", [], 1.0, true);
    expect(listItemCount(out)).toBe(2);
    expect(hasAllColons(out)).toBe(true);
    expect(out.includes("XR-200")).toBe(true);
  });
});

4. 测试覆盖分析

  • 关键路径覆盖:
    • 正常流程:语气与受众参数组合、禁词过滤、实体保留、长度比例、结构保持、返回值类型均覆盖
    • 输入校验:空白折叠、换行、表情与混排、列表/冒号结构保持已覆盖
    • 返回值验证:字符串类型、可序列化(隐含于 Jest 断言与 Node 字符串处理)
    • 边界条件:极短文本、keep_length_ratio 边界(0.8/1.2)、preserve_entities true/false 对比、数字/日期/版本号保留
    • 性能:500字/200ms
  • 风险点说明:
    • 语气与受众风格的自动化判定难以完全量化,当前以结构/术语/实体和合规性为主进行间接校验
    • 标点规范化涉及细节较多,测试以空白与结构保持为主,避免过度耦合实现细节
    • preserve_entities=false 不强制变更实体,测试仅校验 true 时的硬性不变约束

5. 执行建议

  • 执行顺序(建议从快到慢、从基础到约束):
    1. 用例1、5(禁词与实体硬约束)
    2. 用例2、3、12(输入校验与结构保持)
    3. 用例4(极短文本)
    4. 用例6、7(数字/日期/术语保留)
    5. 用例8、9(参数边界)
    6. 用例10(稳定性)
    7. 用例11(性能)
  • 环境要求:
    • Node.js >= 18,Jest >= 29
    • 被测函数以 CommonJS 方式导出:module.exports = { rewrite_text_cn }
    • 运行命令:npx jest tests/rewrite_text_cn.spec.js
    • 建议在本地与 CI 均执行;性能用例在负载稳定环境下运行以减少抖动

1. 函数基本信息

  • 函数名称:continue_paragraph_cn
  • 参数说明:
    • context: String,100-4000字,叙事或说明文,支持对话体与列表
    • target_sentences: Integer,取值范围 2-4,续写目标句数
    • creativity: Float,0.2-0.8,越低越贴近上下文措辞与信息
    • stop_phrases: String[],0-5项,禁止在输出中出现的短语
    • persona: String,作家 或 记者 或 产品经理,控制叙述视角与用词
    • continue_strategy: String,段落 或 句子,段落表示输出单段完整续写,句子表示以句号分隔多句
  • 返回值类型:String(UTF-8),中文标点规范,不包含前后空格

2. 测试场景总览

  • P0(核心功能与合规)
    • TC01 正常续写-记者-句子策略-3句
    • TC02 禁止词过滤-stop_phrases生效
    • TC03 输出句数受控-句子策略精确句号分隔
    • TC04 段落策略-单段输出且句数正确
    • TC05 persona降级-未知persona回退中性记者口吻
    • TC06 性能-300字上下文在250ms内完成
  • P1(结构与边界)
    • TC07 半句结尾-先补全再续写
    • TC08 对话体-保持角色对话结构
    • TC09 列表体-保持条目结构
    • TC10 创造力影响-低创造力更贴近上下文
  • P2(返回值与规范)
    • TC11 返回值规范-UTF-8字符串、首尾无空格、中文标点
    • TC12 长度线性关系-句数越多输出更长且近似线性增长

3. 详细测试用例

  • TC01

    • 测试名称:正常续写-记者-句子策略-3句
    • 前置条件:context字数在100-4000内;persona=记者;continue_strategy=句子;target_sentences=3;creativity=0.4;stop_phrases=[]
    • 测试步骤:调用函数并获取输出
    • 预期结果:输出为单行字符串;包含且仅包含3个中文句号“。”用于分句;语义与上下文主题一致(不做语义断言,仅结构约束)
    • 实际结果:
  • TC02

    • 测试名称:禁止词过滤-stop_phrases生效
    • 前置条件:stop_phrases含["史无前例","天翻地覆"]
    • 测试步骤:调用函数,检查输出
    • 预期结果:输出不包含任一禁止短语(子串匹配)
    • 实际结果:
  • TC03

    • 测试名称:输出句数受控-句子策略精确句号分隔
    • 前置条件:continue_strategy=句子;target_sentences=2
    • 测试步骤:调用函数,统计“。”数量
    • 预期结果:恰好2个“。”且无编号(不包含“1.”、“(一)”等)
    • 实际结果:
  • TC04

    • 测试名称:段落策略-单段输出且句数正确
    • 前置条件:continue_strategy=段落;target_sentences=4
    • 测试步骤:调用函数,检查换行和句数
    • 预期结果:无多余换行(允许内部自然换行为0);中文句号总数为4
    • 实际结果:
  • TC05

    • 测试名称:persona降级-未知persona回退中性记者口吻
    • 前置条件:persona="分析师"(未覆盖)
    • 测试步骤:调用函数,检查第一人称用语
    • 预期结果:不使用第一人称主观口吻(不含“我”“我们”开头的主观陈述)
    • 实际结果:
  • TC06

    • 测试名称:性能-300字上下文在250ms内完成
    • 前置条件:context≈300字;target_sentences=3
    • 测试步骤:记录开始时间,调用函数,记录结束时间
    • 预期结果:耗时≤250ms
    • 实际结果:
  • TC07

    • 测试名称:半句结尾-先补全再续写
    • 前置条件:context以“正在”之类半句结尾;continue_strategy=句子;target_sentences=2
    • 测试步骤:调用函数,观察首句长度
    • 预期结果:首句长度≥8个汉字(表征完成补全而非突兀切换);总句数为2
    • 实际结果:
  • TC08

    • 测试名称:对话体-保持角色对话结构
    • 前置条件:context包含“角色:内容”多轮对话;continue_strategy=段落
    • 测试步骤:调用函数,检查“:”与分行结构
    • 预期结果:输出包含至少1处“:”且延续对话语气(存在行内冒号分隔的说话者)
    • 实际结果:
  • TC09

    • 测试名称:列表体-保持条目结构
    • 前置条件:context为“- ”起始的多项列表;continue_strategy=段落
    • 测试步骤:调用函数,检查是否新增“- ”条目
    • 预期结果:输出包含“- ”的新条目至少1项
    • 实际结果:
  • TC10

    • 测试名称:创造力影响-低创造力更贴近上下文
    • 前置条件:同一context;分别调用creativity=0.25与0.7
    • 测试步骤:计算两版本与context的字符二元组相似度
    • 预期结果:相似度(0.25) ≥ 相似度(0.7)
    • 实际结果:
  • TC11

    • 测试名称:返回值规范-UTF-8、无首尾空格、中文标点
    • 前置条件:任意合法参数
    • 测试步骤:调用函数,检查类型与首尾空格、英文标点
    • 预期结果:类型为str;s==s.strip();不包含英文".,!?"; 结尾为中文标点(如“。”)
    • 实际结果:
  • TC12

    • 测试名称:长度线性关系-句数增大输出更长
    • 前置条件:同一context与其余参数;对比target_sentences=2与4
    • 测试步骤:分别调用并获取长度
    • 预期结果:len(4句) > len(2句)×1.6(近似线性增长)
    • 实际结果:

4. 可执行测试用例代码(pytest)

# -*- coding: utf-8 -*-
import re
import time
from typing import List

# 将下方导入替换为实际模块路径
# from your_module import continue_paragraph_cn

def continue_paragraph_cn(context: str, target_sentences: int, creativity: float,
                          stop_phrases: List[str], persona: str, continue_strategy: str) -> str:
    # 占位:请在项目中导入真实实现。本占位用于避免示例无法运行。
    raise NotImplementedError("Import the real continue_paragraph_cn from your codebase.")

def count_cn_full_stops(s: str) -> int:
    # 仅统计中文句号
    return s.count("。")

def jaccard_char_bigram_similarity(a: str, b: str) -> float:
    def bigrams(x: str):
        return {x[i:i+2] for i in range(len(x)-1)}
    A, B = bigrams(a), bigrams(b)
    if not A or not B:
        return 0.0
    return len(A & B) / len(A | B)

BASE_CONTEXT = (
    "城市气温在两天内迅速下滑,凌晨最低温已经逼近零下十度。为保障民生与能源安全,供热部门连夜调整锅炉出水温度,"
    "并在重点小区加派巡检人员。交通方面,早高峰出现轻微拥堵,部分路段因结冰需要临时管控。指挥中心通过负荷监测平台"
    "观察到夜间用热曲线陡增,峰值较上周同期提升一成。综合部门正在评估能耗与居民舒适度之间的平衡,并研判是否在今晚启用"
    "差异化的峰谷电价引导方案,以平滑负荷与降低调度压力。"
)

DIALOG_CONTEXT = (
    "居民甲:今晚暖气有点凉,你们是不是在降温?\n"
    "居民乙:我听说是夜里负荷冲得太高了。\n"
    "调度员:我们正在看曲线,尽量把温度稳住。\n"
)

LIST_CONTEXT = (
    "- 晚高峰地铁出现三次短时延误\n"
    "- 供热站2号锅炉完成临检并恢复运行\n"
    "- 市场电价波动加剧,交易中心发布预警\n"
)

HALF_SENTENCE_CONTEXT = (
    "随着冷空气南下,二级管网多点告警触发,夜间负荷峰值抬升,"
    "值守人员增派至重点小区,指挥中心正在"
)

FORBIDDEN = ["史无前例", "天翻地覆"]

def test_tc01_normal_journalist_sentence_3():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=3, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    assert isinstance(out, str)
    assert "\n" not in out
    assert count_cn_full_stops(out) == 3

def test_tc02_stop_phrases_filtered():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=3, creativity=0.5,
        stop_phrases=FORBIDDEN, persona="记者", continue_strategy="句子"
    )
    for p in FORBIDDEN:
        assert p not in out

def test_tc03_sentence_strategy_exact_sentences():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=2, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    assert count_cn_full_stops(out) == 2
    assert not re.search(r"\b1\.\b|\(一)|\(一\)", out)

def test_tc04_paragraph_strategy_single_paragraph_4():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=4, creativity=0.5,
        stop_phrases=[], persona="记者", continue_strategy="段落"
    )
    assert isinstance(out, str)
    # 单段:不应主动分多段,避免多余换行
    assert "\n\n" not in out
    assert count_cn_full_stops(out) == 4

def test_tc05_persona_fallback_unknown_to_neutral():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=2, creativity=0.5,
        stop_phrases=[], persona="分析师", continue_strategy="句子"
    )
    # 中性记者口吻不应使用明显第一人称主观陈述
    assert not re.search(r"(^|[,。;!])我(们)?", out)

def test_tc06_performance_under_250ms_for_300_chars():
    context_300 = BASE_CONTEXT  # ~300字
    t0 = time.perf_counter()
    out = continue_paragraph_cn(
        context=context_300, target_sentences=3, creativity=0.5,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    t1 = time.perf_counter()
    elapsed_ms = (t1 - t0) * 1000
    assert elapsed_ms <= 250, f"elapsed={elapsed_ms}ms"
    assert isinstance(out, str) and len(out) > 0

def test_tc07_half_sentence_completion_first_sentence_long_enough():
    out = continue_paragraph_cn(
        context=HALF_SENTENCE_CONTEXT, target_sentences=2, creativity=0.3,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    sentences = out.split("。")
    # 移除结尾空串
    sentences = [s for s in sentences if s]
    assert len(sentences) >= 2
    assert len(sentences[0]) >= 8  # 首句应体现补全而非突兀切换

def test_tc08_dialogue_structure_preserved():
    out = continue_paragraph_cn(
        context=DIALOG_CONTEXT, target_sentences=2, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="段落"
    )
    # 继续使用“:”的说话者结构
    assert ":" in out

def test_tc09_list_structure_preserved():
    out = continue_paragraph_cn(
        context=LIST_CONTEXT, target_sentences=2, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="段落"
    )
    # 至少新增一个以“- ”开头的条目或在段内包含“- ”
    assert out.strip().startswith("- ") or "\n- " in out

def test_tc10_creativity_affects_similarity():
    out_low = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=3, creativity=0.25,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    out_high = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=3, creativity=0.7,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    sim_low = jaccard_char_bigram_similarity(out_low, BASE_CONTEXT)
    sim_high = jaccard_char_bigram_similarity(out_high, BASE_CONTEXT)
    assert sim_low >= sim_high * 0.95  # 允许轻微波动,但整体应更贴近

def test_tc11_return_value_conventions():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=2, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    assert isinstance(out, str)
    assert out == out.strip()
    # 不包含英文标点
    assert not re.search(r"[.,!?]", out)
    # 以中文标点收尾(常见:。!?)
    assert re.search(r"[。!?]$", out) is not None

def test_tc12_length_linear_with_sentence_count():
    out2 = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=2, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    out4 = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=4, creativity=0.4,
        stop_phrases=[], persona="记者", continue_strategy="句子"
    )
    # 4句应显著长于2句,且近似线性增长
    assert len(out4) > len(out2) * 1.6
    assert count_cn_full_stops(out2) == 2
    assert count_cn_full_stops(out4) == 4

def test_persona_product_manager_vocabulary_hint():
    out = continue_paragraph_cn(
        context=BASE_CONTEXT, target_sentences=3, creativity=0.4,
        stop_phrases=[], persona="产品经理", continue_strategy="句子"
    )
    # 产品经理口吻常提及“用户/体验/指标/方案”
    assert any(k in out for k in ["用户", "体验", "指标", "方案"])

5. 测试覆盖分析

  • 关键路径覆盖
    • 续写核心输出与句数控制(TC01, TC03, TC04):覆盖输出结构与策略分支
    • 禁止词过滤(TC02):覆盖风险控制分支
    • persona分支与降级(TC05,附加PM词汇校验用例):覆盖角色风格选择与回退
    • 半句补全(TC07)、对话(TC08)、列表(TC09):覆盖结构边界分支
    • 创造力影响(TC10):覆盖生成策略参数对相似度的影响
    • 返回值规范(TC11):覆盖格式化与合规性
    • 性能(TC06)与长度线性(TC12):覆盖性能要求与回归趋势
  • 风险点说明
    • 生成模型的随机性可能导致TC10轻微波动,已设置宽松阈值
    • 不同文本风格可能使用“;”“!”等结尾标点,TC03/TC11针对句子策略严格要求“。”,用于确保一致性
    • 对话与列表结构在复杂上下文中可能混合,TC08/TC09以保守断言验证结构延续

6. 执行建议

  • 执行顺序
    • 先运行P0用例(TC01-TC06),快速验证核心功能、过滤与性能
    • 再运行P1用例(TC07-TC10),覆盖结构边界与创造力影响
    • 最后运行P2用例(TC11-TC12),校验规范性与线性趋势
  • 环境要求
    • Python 3.9+,pytest 7+;本地与CI需一致的编码环境(UTF-8)
    • CPU常规开发机;避免并发运行性能用例,独立计时
    • 若实现支持随机种子,建议在测试前设置固定种子以降低波动

示例详情

解决的问题

将函数名称、参数与期望行为快速转化为完整、可复用的后端测试用例套件;在几分钟内覆盖正常流程、边界与异常场景,并自动给予优先级与执行建议;显著降低人工编写成本与遗漏风险,为单元、集成、回归等测试场景提供标准化输出,帮助团队提升发布速度与质量稳定,激发试用兴趣并清晰展示进阶版本的付费价值。

适用用户

后端开发工程师

新功能提交前,一键生成基础与边界测试,用最短时间验证核心逻辑,提升重构与合并的安全性。

QA测试工程师

将需求与函数说明快速转成结构化用例,按风险设优先级,覆盖异常路径,减少手写与沟通成本。

技术负责人/架构师

为团队统一测试规范,查看覆盖与风险综述,决定补测计划与资源投入,持续提升质量指标。

特征总结

一键生成结构化后端测试用例,基于函数名与参数自动匹配业务场景,快速上手。
自动识别正常流程、边界与异常场景,全面覆盖关键路径,降低漏测与回归风险。
按优先级自动排列执行顺序,先测高风险与核心逻辑,帮助团队快速抓住质量要点。
支持单元与集成测试类型一键切换,生成可复用模板,适配不同项目与框架节奏。
自动输出清晰的测试步骤与预期结果,降低沟通成本,让新人也能按图执行不走偏。
基于业务上下文进行智能分析,自动补齐遗漏场景与断言,减少手动维护与返工。
内置最佳实践规范与可维护结构,生成结果稳定可复用,便于持续迭代与版本管理。
适配代码审查、重构与持续集成流程,自动补充覆盖空白,让质量提升与交付速度并行。
支持自定义参数与结果样式,一键套用团队规范,快速融入现有测试与评审流程。
提供覆盖率与风险点综述,帮助定位薄弱环节,指导后续补测与资源分配决策。

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

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

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

2. 发布为 API 接口调用

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

3. 在 MCP Client 中配置使用

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

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

您购买后可以获得什么

获得完整提示词模板
- 共 668 tokens
- 4 个可调节参数
{ 函数名称 } { 参数描述 } { 预期行为描述 } { 测试重点与范围 }
获得社区贡献内容的使用权
- 精选社区优质案例,助您快速上手提示词
使用提示词兑换券,低至 ¥ 9.9
了解兑换券 →
限时半价

不要错过!

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

17
:
23
小时
:
59
分钟
:
59