Jean's Blog

一个专注软件测试开发技术的个人博客

0%

AI大模型提示词工程

与AI对话

提示词Prompt介绍

  1. 对于普通人:提示词是和 AI 沟通的桥梁,提示词的好坏决定了返回的结果是否准确。
  2. 对于开发者:提示工程是一种相对较新的学科,专门用于开发和优化提示,以高效地使用语言模型(LM)来处理各种应用和研究主题。

提示词的原则与技巧

原则 原因
写清楚需求 GPT 模型无法读懂您的想法,因此在提供需求时尽可能具体是很重要的。这包括在您的查询中包含详细信息,要求模型采用角色,以及使用定界符清楚地指示输入的不同部分。
提供参考文本 如果可以,请提供与您希望模型生成的内容相似的参考文本。这将有助于模型了解您要查找的内容并生成更准确的结果。
将复杂的任务拆分为更简单的子任务 如果您试图让模型做一些复杂的事情,将任务分解为更小、更易于管理的子任务会很有帮助。这将使模型更容易理解您的要求并生成更准确的结果。
角色扮演 这个技巧的作用是告诉ChatGPT在对话中扮演一个特定的角色或人物。这对于创造更有吸引力和沉浸感的对话,或模拟真实世界的场景特别有用。
系统地测试变化 对需求或参考文本进行更改时,重要的是系统地测试结果以了解它们如何影响模型的输出。这将帮助您确定对改进结果最有效的更改。

写清楚需求

编写有效的ChatGPT的难点之一是表达含糊不清。为了避免这个问题,有以下几个问题需要注意:

  1. 定义任何专业术语或技术术语。
  2. 避免使用模棱两可的语言。
  3. 使用清晰或简明的语言
  • 错误案例:”你是我的哈基米吗?”

    哈基米属于网络用语,而且诞生在2023年,ChatGPT是无法理解这个词的语意的。

    image-20230904153857689

  • 好的案例:”请帮我提供在深圳市宝安区所有的咖啡馆”

    简明扼要说清楚自己的需求,无需多言,ChatGPT便很好理解了。

    image-20230904154007912

提供参考文本

  1. 对于文本比较短的引用,可以直接贴到提问里面即可: 如果你有一段法律条款,并希望模型使用这段条款来解释某个概念,例如,我给ChatGPT一段代码,分析代码的Bug

    image-20230904154421304

  2. 网页链接的引用: 也可以直接将网页链接里面的内容提供给 GPT 来作为引用文本。比如可以直接给它一个链接地址,让它总结文章内的内容。(注意这个功能需要使用web插件)

拆解复杂任务

作为一个厨师,在做饭的时候需要完成这些步骤:准备食材、清理食材、处理食材、开始烹饪、摆盘。

在这个过程中,其实厨师就是把一个复杂的任务,拆解成了多个简单的任务。其实在编程的过程中,也是同样的道理。也会把一个复杂需求,拆解为N个简单的子需求。

如果需要ChatGPT帮助我们完成一个复杂的任务,那么,我们需要预先帮它把任务拆分。这样做的优点是:

  1. 更好理解每一个操作步骤。
  2. 不被上下文限制影响。
  3. 方便调整。

例如,我们提出了一个如下的复杂任务:

  • 提示词:作为一个测试工程师,我即将进行述职答辩,我想编写一个述职报告,述职报告需要包含我今年的成绩、我明年的目标、以及我在今年的工作过程中碰到的问题

ChatGPT 虽然给到了相应的回复,但是还有问题:

  1. 工作成绩没有清晰的数据也没有说服力,看着比较干瘪。报告内容没有图表。
  2. 内容太过简单空洞。
  3. 格式不够优雅。

如果我们把提问的方式做进一步优化,把这个复杂问题一步步进行拆解,并给ChatGPT一定的修改反馈,则产生的内容会更加符合我们的需求,比如我们可以把问题分解为:

  • 提示词:作为一个测试工程师,我即将进行述职答辩,我想编写一个述职报告。述职报告需要包含我今年的成绩,我今年带领测试团队将bug的逃逸率降低了10%的比例。并且我希望有一个通过echarts绘制的折线图。请将我的述职报告做进一步优化。

    image-20230904155058134

  • 提示词: echarts 折线图没有展示出来

    image-20230904155223593

借助外部工具

作为一个大语言生成模型,GPT4 并不擅长各种数学计算。比如下面的问题(来自官方 GPT 最佳指南中的示例问题):

  • 提示词:查找以下多项式的所有实值根:3x^5 - 5x^4 - 3x^3 - 7x - 10

如果直接提问的话,通常没法直接给出答案,如下图所示,虽然借助Python,给出了运算过程,但是其实ChatGPT无法像人类数学家一样,给出直接的推导过程:

image-20230904155335208

所以可以将提示词改为:

  • 提示词:查找以下多项式的所有实值根:3x^5 - 5x^4 - 3x^3 - 7x - 10 ,使用Python 实现

    image-20230904155551020

角色扮演

角色扮演的过程就更为简单了,我们在编写提示词的时候,只需要给它加上一些角色的设定。

ChatGPT甚至可以扮演领导,面试官,浏览器的console插件等各种各样我们可以想象到的角色:

  • 提示词:我希望你作为一个 javascript 控制台。我将输入命令,你回复javascript 控制台应显示的内容。我希望您只在一个唯一的代码块内回复终端输出,而不是其他任何内容。不要写解释。我的第一个命令是 console.log(“Hello World”);

    image-20230904155950703

系统的测试变化

正如人在回复信息的时候,也无法保证所有的回复都是正确的,ChatGPT 也无法保证每次给到的信息都是“靠谱的”或者是满足需求的。

所以ChatGPT的每一次回复,在确认没有问题之后,再使用。如果有问题的话,可以进一步进行提问,ChatGPT会根据提示词不停的纠正回复。以达到一个满意的效果。

image-20230904160046303

比如这个示例:

  • 提示词:请问 App 的产品在测试的过程中需要注意什么

    image-20230904160251993

  • 提示词:请针对兼容性测试再做一些补充

    image-20230904160422314

通过不停的测试以及纠正 ChatGPT 的回复,即可最终获得一个满意的回复。

提示词相关概念

通过上面内容对大模型如何进行对话介绍,下面内容则是详细介绍提示词相关具体内容

什么是提示词(Prompt)?

概念说明:

  • 提示词是用户与大模型交互的输入指令,用于告诉模型你希望它完成什么任务。
  • 它既可以是一句话,也可以是一段上下文或示例。

举例:

请撰写一份关于用户注册功能的测试用例。

什么是 Token?

概念说明:

  • 模型处理的最小单位,通常是词的一部分、一个单词,甚至一个符号*。

举例:

  • “Deepseek 是厉害的。” → 分词可能为: ["Deepseek", " 是", " 厉", "害", "的", "。"]

上下文窗口(Context Window)

1
128K 的上下文==128000 个 token

概念说明:

  • 指模型每次处理输入 + 输出的最大 token 数量
  • 超出后旧内容将被“遗忘”

注意点💡

  • 长 prompt ≠ 好效果,要“信息密度高且结构清晰”。
  • 内容越多,token 消耗越多 → 成本 ↑、速度 ↓。

常见大模型的上下文最大Token记忆数量:

  • GPT4 —-> 128K
  • DeepSeekV3 —->128K

Prompt 与响应的关系

基本流程:

  1. 用户发出 Prompt
  2. 模型理解并生成响应
  3. 模型根据上下文和历史对话生成“合理推测”

模型生成原理:

  • 本质是下一个最可能的 token 预测
  • 模型没有“理解”,而是基于概率选择“合适的词”。

Prompt 与输出质量的关系:

  • Prompt 不清晰 → 响应不确定甚至出现“幻觉”
  • Prompt 精准 → 响应更专业、格式更一致

什么是提示词工程?

概念说明:

提示词工程是指系统性地设计、优化与测试提示词的技术和方法,以引导大语言模型产生预期、高质量、可控的输出。

作用:

  • 增强模型可靠性一致性
  • 控制模型输出格式风格
  • 降低“胡编乱造”(幻觉)的风险

提示词角色设定

role 的类型及语义说明

角色(role) 说明 示例场景
system 系统设定。用来告诉模型它的角色、行为风格、语境范围等。 设定模型是“测试专家”、“英语老师”、“客服机器人”等
user 用户输入。代表人类给模型提的问题或指令。 提问、请求、任务说明
assistant 模型回复。由大语言模型根据前文生成的回答。 模型生成输出,如回答问题、给建议
tool(可选) 工具调用(部分模型支持)。用于中间调用工具函数或API时的中间交互。 使用函数调用插件、调用代码执行器等

基础角色设定

给模型“扮演”某个角色,设定行为风格与语言风格

特点:

  • 模拟身份让输出更真实、更符合特定语境
  • 非常适合教育、技术、客服等行业场景

示例1:标准问答流程

1
2
3
messages = [
{"role": "user", "content": "请用通俗易懂的方式讲解“时态”概念?"}
]

示例2:英语教学风格

1
2
3
4
5
6
messages = [
{
'role': 'user',
'content': '你是一个专业的英语老师,请用通俗易懂的方式讲解“时态”概念。'
}
]

示例3:测试主管角色扮演

1
2
3
4
messages = [
{'role': 'user',
'content': '你是一个经验丰富的软件测试主管,请评审以下测试用例是否合理,并提出优化建议:\n用例:用户注册时输入无效邮箱应提示错误信息。'}
]

使用system设定角色

示例1:设定身份与风格(使用 system)

1
2
3
4
messages = [
{"role": "system", "content": "你是一名严谨且有经验的软件测试工程师,回答需清晰、专业、有条理。"},
{"role": "user", "content": "请列出注册功能的边界测试用例。"}
]

示例2:错误场景分析

1
2
3
4
messages = [
{"role": "system", "content": "你是一个擅长分析测试日志的QA专家,能快速定位问题根源。"},
{"role": "user", "content": "测试报告显示登录接口返回500错误,可能是什么原因?"}
]

示例3:技术方案咨询

1
2
3
4
messages = [
{"role": "system", "content": "你是自动化测试工具专家,熟悉主流测试框架。"},
{"role": "user", "content": "如何用Pytest对API响应做Schema验证?"}
]

对比

  1. 角色设定的位置不同:system消息用于长期角色设定,而user消息中的角色指示是即时的
  2. 结构规范性:按照官方的最佳实践,角色和风格应该放在system消息中,这样更清晰和持久。
  3. 效率:使用system消息可以避免重复指定角色,提高对话效率。
  4. 清晰度:system消息明确区分角色设定和具体请求,而user中的角色指示可能混合了指令和角色设定,不够清晰

提示词优化的技巧

技巧1:明确指令

  • 模型更擅长处理任务明确的请求。
  • 含糊的描述容易导致输出不符合预期。

示例一:写接口测试代码

1
2
# 模糊提示:
messages = [{"role": "user", "content": "帮我写个接口测试代码"}]
1
2
3
4
5
# 明确提示:
messages = [{
"role": "user",
"content": "请使用 Python 和 requests 编写一个 POST 接口的测试脚本,接口地址为 https://api.mstest.vip/login,参数包括 username 和 password,校验响应中 code 是否为 200。"
}]

技巧2:控制风格与格式

  • 通过提示控制模型以 Markdown、表格、列表、JSON 等格式输出。
  • 用于生成日报、Bug列表、测试报告、接口说明等结构化内容。

示例一:Markdown报告

1
2
3
4
messages = [
{"role": "user",
"content": "请用Markdown生成用户中心测试报告,必须包含:\n## 模块名称\n## 测试范围\n## 通过率\n## 关键缺陷\n## 剩余风险"}
]

示例二:表格用例

1
2
3
4
messages = [
{"role": "user",
"content": "请用表格展示5条注册测试用例,列名包括:\n| 用例ID | 测试点 | 测试数据 | 预期结果 |"}
]

示例三:JSON接口用例

1
2
3
messages = [
{"role": "user", "content": "请生成JSON格式的'修改密码'接口测试用例,字段包含:\ntest_case_id, description, request_data, expected_response"}
]

技巧3:加入约束,减少幻觉

  • 模型在生成实时性内容时可能产生“幻觉”(虚假或伪造内容)。
  • 限定“来源、时间、事实标准”等可以有效降低这种风险。

示例一:对比Selenium版本新特性

1
2
3
4
5
# 宽泛提示
messages = [{"role": "user", "content": "请介绍 Selenium 的最新变化"}]

# 高约束提示
messages = [{"role": "user", "content": "请根据 Selenium 4.20 官方文档,总结 Python 中相较 Selenium 3 的五个主要变化,并附对应代码示例。"}]

示例二:生成测试用例

1
2
3
4
5
6
7
# 宽泛提示
messages = [{"role": "user", "content": "请为用户注册功能设计5条测试用例"}]
# 高约束提示
messages = [
{"role": "user",
"content": "请为用户注册功能设计 5 条测试用例,要求:\n- 包含有效与无效邮箱输入\n- 密码边界值测试(6~20位)\n- 每条用例需包含:用例名称、前置条件、输入、预期输出\n- 输出为纯文本描述,不包含自动化脚本"}
]

示例三:生成Bug报告

1
2
3
4
5
6
7
8
9
messages = [
{"role": "user",
"content": "请撰写一份缺陷报告模版"}
]

messages = [
{"role": "user",
"content": "请撰写一份缺陷报告模版,要求:\n- 模块:登录页\n- 问题描述:输入错误密码后无提示信息\n- 必须包含字段:缺陷标题、环境、重现步骤、实际结果、预期结果\n- 使用中性客观语言"}
]

技巧4:少量样本提示

  • 通过示例“教”模型学会相应的分类或转换任务。
  • 非常适合缺陷分类、日志解析、测试案例格式转换等。

示例一:测试步骤转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
messages = [
{"role": "user", "content": """
将自然语言测试步骤转换为结构化步骤:
---
示例1:
输入:用户输入错误的密码点击登录
输出:
1. 在密码输入框输入错误密码
2. 点击登录按钮

示例2:
输入:选择商品加入购物车并结算
输出:
1. 在商品页点击「加入购物车」
2. 进入购物车页面
3. 点击「结算」按钮
---
请转换以下步骤:
输入:上传JPG文件后检查预览图显示
输出:
"""}
]

示例二:自动化测试故障分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
instruction = """
作为资深测试开发工程师,请分析自动化测试失败日志:
1. 失败类型分类:
- 定位问题(元素/XPath失效)
- 环境问题(服务/网络异常)
- 脚本缺陷(逻辑/断言错误)
2. 标记可疑代码位置(文件+行号)
3. 给出修复方案(含代码示例)
"""

examples = """
输入:
[ERROR] ElementNotVisibleException:
Failed to locate element #submit-btn
at line 42 of login_test.py

输出:
失败类型:定位问题(元素ID变更)
可疑位置:login_test.py第42行
修复方案:
原代码:driver.find_element(By.ID, "submit-btn")
改为:WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "[data-testid=submit]"))
)
"""

input_text = '[FAIL] AssertionError: Expected 200, got 404 at api_healthcheck.py:17'

prompt = f"""
{instruction}

{examples}

输入:
{input_text}

输出:
"""

技巧5:链式思维

示例一:基础算术(分步推理)

1
2
3
4
5
6
7
8
9
10
11
messages = [
{"role": "user", "content": """
请逐步解决以下数学问题,并展示推理过程:
问题:如果3个人5天能挖15米水沟,6个人10天能挖多少米?

分步思考:
1. 计算单人单天效率:15米 ÷ 3人 ÷ 5天 = 1米/人天
2. 计算6人10天总效率:1米/人天 × 6人 × 10天 = ?
3. 最终结果:
"""}
]

示例二:测试点分析

1
2
3
4
5
6
7
8
messages = [
{"role": "user", "content": """请逐步分析登录功能的测试点,
按以下逻辑展开:
1. 识别输入字段(用户名/密码)
2. 列出每个字段的合法/非法输入情况
3. 分析页面交互流程(按钮状态、错误提示等)
最终输出结构化测试点列表"""}
]

提示词指令模板

作用:通过结构化模板控制模型输出,实现高效可复现的任务处理

特点

  • 直接高效 - 减少模糊指令导致的无效输出
  • 可复现性强 - 固定模板确保结果一致性
  • 动态适配 - 支持变量插值灵活填充内容

模板结构

字段名 作用 示例
{instruction} 定义任务目标和输出格式要求 “生成法语翻译,保留专业术语”
{examples} 提供输入-输出样本(可选) “输入:Hello → 输出:Bonjour”
{input_text} 用户实际需要处理的内容 “How are you?”
{output} 模型生成结果的占位符 (留空由模型填充)

使用案例

自动化测试故障分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
instruction = """
作为资深测试开发工程师,请分析自动化测试失败日志:
1. 失败类型分类:
- 定位问题(元素/XPath失效)
- 环境问题(服务/网络异常)
- 脚本缺陷(逻辑/断言错误)
2. 标记可疑代码位置(文件+行号)
3. 给出修复方案(含代码示例)
"""

examples = """
输入:
[ERROR] ElementNotVisibleException:
Failed to locate element #submit-btn
at line 42 of login_test.py

输出:
失败类型:定位问题(元素ID变更)
可疑位置:login_test.py第42行
修复方案:
原代码:driver.find_element(By.ID, "submit-btn")
改为:WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "[data-testid=submit]"))
)
"""

input_text = '[FAIL] AssertionError: Expected 200, got 404 at api_healthcheck.py:17'

prompt = f"""
{instruction}

{examples}

测试日志:
{input_text}

分析报告:
"""

提示词设计案例(测试相关)

需求整理测试点(零样本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
system_role = "你是一位有10年经验的资深软件测试工程师,精通测试需求分析"

content = """
请根据以下需求文档生成测试点,以“功能正常+边界+异常”为主线思维指导生成测试点

📌 F1.3 用户信息修改
🧩 功能背景
用户可修改昵称、密码、头像、性别等基础信息。
🚶 主流程
1. 用户进入“个人中心”
2. 修改某字段并保存
3. 系统校验内容合法性(如昵称长度、头像格式)
4. 修改成功后刷新显示
⚠ 异常流程
用户未登录:提示登录后操作
输入非法字符:提示不符合规范
📌 业务规则
昵称长度大于3 小于20,支持中英文
性别只能为“男 / 女 / 保密”
头像图片限制大小(2M以内),格式为 png/jpg/jpeg

"""

messages = [
{'role':'system',"content":role},
{'role':"user","content":content}
]

基于需求整理测试点(少量样本)一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# =============系统设定提示词===========================
# 系统身份设定
role = """
你是一位有10年经验的资深软件测试工程师,精通测试需求分析
请根据以下需求文档生成测试点,以“功能正常+边界+异常”为主线思维指导生成测试点
"""

# 测试点生成的样本
examples = """
输入:
需求文档:
##### 功能背景
验证码用于绑定账号、身份验证、找回密码等关键环节。
##### 主流程
1. 用户点击“获取验证码”
2. 系统验证发送频率与目的合法性
3. 向目标手机号/邮箱发送验证码
4. 用户输入进行验证
##### 异常流程
- 发送过快:提示“请勿频繁操作”
- 验证码已失效:提示“请重新获取”
##### 业务规则
- 同一手机号/邮箱每分钟限发1次,每小时最多5次
- 验证码为6位数字,有效期5分钟
- 验证成功后销毁验证码记录
输出:
├─ 正向验证
│ ├─ 获取验证码后成功发送到手机号/邮箱
│ ├─ 验证码输入正确,验证通过并进入后续流程
│ ├─ 验证成功后验证码记录被销毁
│ └─ 多个业务场景(绑定、找回、登录)均可正常使用验证码流程
├─ 边界测试
│ ├─ 验证码长度校验(少1位/多1位/非数字)
│ ├─ 验证码在5分钟临界点前验证仍有效
│ ├─ 验证码5分钟后自动失效提示“验证码已失效”
│ └─ 每分钟第1次能发,第2次提示过快,每小时第6次提示超限
├─ 异常处理
│ ├─ 未输入验证码直接提交,提示“请输入验证码”
│ ├─ 输入错误验证码,提示“验证码错误”
│ ├─ 验证码过期后输入,提示“验证码已失效”
│ ├─ 非法请求验证码接口(无session或业务上下文),返回异常
│ └─ 网络异常/接口超时时的错误提示与重试策略
└─ 体验性测试(增强用)
├─ 验证码输入框是否支持自动填充(邮件/SMS自动读取)
├─ 快速点击获取验证码按钮多次是否有节流/灰显
├─ 获取验证码后的按钮倒计时效果是否清晰
└─ 输入法切换是否影响验证码输入行为(如中文输入法拦截)

"""

system = f"""
{role}

{examples}
"""

基于需求整理测试点(少量样本)二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# =============系统设定提示词===========================
# 系统身份设定
role = """
你是一位有10年经验的资深软件测试工程师,精通测试需求分析,需要你根据需求文档生成测试点,整理为正向测试点和反向测试点
"""

# 测试点生成的样本
examples = """
输入:
需求文档:
##### 功能背景
新用户通过注册方式创建账户,支持邮箱/用户名+密码的注册方式。
##### 主流程
1. 用户打开注册页,填写注册信息
2. 系统校验格式与唯一性(用户名、邮箱)
3. 提交注册,后台创建账户,初始状态为“正常”
4. 注册成功后自动登录并跳转首页
##### 异常流程
- 邮箱/用户名已被注册:提示“已存在”
- 两次密码不一致:提示用户重新输入
##### 业务规则
- 用户名唯一,支持 4~20 位字母数字组合
- 密码长度不少于 6 位
- 邮箱必须符合格式 `xxx@xxx.xx`
输出:
#### 正向测试点(正常流程,预期成功)
1. **邮箱注册成功**
- 输入符合格式的新邮箱(如 `test123@example.com`)+ 有效密码(≥6位)→ 注册成功,自动登录并跳转首页
2. **用户名注册成功**
- 输入4-20位字母数字组合的新用户名(如 `user123`)+ 有效密码 → 注册成功
3. **密码符合要求**
- 密码长度≥6位(如 `Pass123`)→ 允许提交
4. **登录与跳转**
- 注册成功后自动跳转至首页,且保持登录状态

#### 反向测试点(异常流程,预期失败或提示)
1. **邮箱格式错误**
- 输入无`@`的邮箱(如 `test.example.com`)→ 提示“邮箱格式错误”
2. **邮箱已被注册**
- 输入已存在的邮箱 → 提示“邮箱已存在”
3. **用户名格式错误**
- 输入含特殊字符的用户名(如 `user@123`)→ 提示“仅支持字母数字”
- 输入长度<4或>20的用户名 → 提示“用户名需4-20位”
4. **用户名已被注册**
- 输入已存在的用户名 → 提示“用户名已存在”
5. **密码长度不足**
- 输入5位密码(如 `12345`)→ 提示“密码至少6位”
6. **两次密码不一致**
- 密码输入`Pass123`,确认密码输入`Pass456` → 提示“密码不一致”
7. **必填字段为空**
- 邮箱/用户名、密码、确认密码任一为空 → 提示“请填写完整信息”
8. **默认状态异常**
- 注册后状态非“正常”(如未激活/锁定)→ 需排查后台逻辑

输入:
需求文档:
##### 🧩 功能背景
验证码用于绑定账号、身份验证、找回密码等关键环节。
##### 🚶 主流程
1. 用户点击“获取验证码”
2. 系统验证发送频率与目的合法性
3. 向目标手机号/邮箱发送验证码
4. 用户输入进行验证
##### ⚠️ 异常流程
- 发送过快:提示“请勿频繁操作”
- 验证码已失效:提示“请重新获取”
##### 📌 业务规则
- 同一手机号/邮箱每分钟限发1次,每小时最多5次
- 验证码为6位数字,有效期5分钟
- 验证成功后销毁验证码记录
输出:

"""

system = f"""
{role}

{examples}
"""

结构化用例生成(少量样本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
role = """
你是一位有10年经验的软件测试工程师,精通需求分析和用例设计
"""

system = """
你是一位有10年经验的软件测试工程师,精通需求分析和用例设计
请基于下面的测试点,结合覆盖功能 + 探测缺陷的思维生成标准的测试用例,测试用例的八要素(

输入:
#### 正向测试点(正常流程,预期成功)
1. **邮箱注册成功**
- 输入符合格式的新邮箱(如 `test123@example.com`)+ 有效密码(≥6位)→ 注册成功,自动登录并跳转首页
2. **用户名注册成功**
- 输入4-20位字母数字组合的新用户名(如 `user123`)+ 有效密码 → 注册成功
3. **密码符合要求**
- 密码长度≥6位(如 `Pass123`)→ 允许提交
4. **登录与跳转**
- 注册成功后自动跳转至首页,且保持登录状态

#### 反向测试点(异常流程,预期失败或提示)
1. **邮箱格式错误**
- 输入无`@`的邮箱(如 `test.example.com`)→ 提示“邮箱格式错误”
2. **邮箱已被注册**
- 输入已存在的邮箱 → 提示“邮箱已存在”
3. **用户名格式错误**
- 输入含特殊字符的用户名(如 `user@123`)→ 提示“仅支持字母数字”
- 输入长度<4或>20的用户名 → 提示“用户名需4-20位”
4. **用户名已被注册**
- 输入已存在的用户名 → 提示“用户名已存在”
5. **密码长度不足**
- 输入5位密码(如 `12345`)→ 提示“密码至少6位”
6. **两次密码不一致**
- 密码输入`Pass123`,确认密码输入`Pass456` → 提示“密码不一致”
7. **必填字段为空**
- 邮箱/用户名、密码、确认密码任一为空 → 提示“请填写完整信息”
8. **默认状态异常**
- 注册后状态非“正常”(如未激活/锁定)→ 需排查后台逻辑
输出:
| 用例编号 | 用例名称 | 前置步骤 | 测试步骤 | 输入数据 | 预期结果 | 实际结果 | 备注 |
| ---------- | ------------------ | ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------- | -------- | -------- |
| TC_REG_001 | 邮箱注册成功 | 无 | 1. 打开注册页面 2. 输入合法邮箱 `test123@example.com` 3. 输入合法密码 `Pass123` 4. 确认密码输入 `Pass123` 5. 点击“注册”按钮 | 邮箱:test123@example.com 密码:Pass123 确认密码:Pass123 | 注册成功,自动跳转至首页,用户保持登录状态 | | 正向用例 |
| TC_REG_002 | 用户名注册成功 | 无 | 1. 打开注册页面 2. 输入合法用户名 `user123` 3. 输入合法密码 `Abcd1234` 4. 确认密码输入一致 5. 点击“注册”按钮 | 用户名:user123 密码:Abcd1234 确认密码:Abcd1234 | 注册成功,自动跳转至首页,用户保持登录状态 | | 正向用例 |
| TC_REG_003 | 密码符合要求 | 无 | 1. 打开注册页面 2. 输入用户名或邮箱 3. 输入密码 `Pass123`(长度 ≥6) 4. 输入相同确认密码 5. 点击“注册” | 用户名:user567 密码:Pass123 确认密码:Pass123 | 表单验证通过,允许提交,注册成功跳转首页 | | 正向用例 |
| TC_REG_004 | 注册后自动登录跳转 | 无 | 1. 打开注册页面 2. 输入合法注册信息并完成注册 3. 注册完成后观察页面跳转和登录状态 | 任意有效注册信息 | 注册成功后跳转至首页,用户已处于登录状态 | | 正向用例 |
| TC_REG_005 | 邮箱格式错误 | 无 | 1. 打开注册页面 2. 输入非法邮箱 `test.example.com` 3. 输入合法密码 4. 点击“注册” | 邮箱:test.example.com 密码:Pass123 确认密码:Pass123 | 提示“邮箱格式错误”,不允许提交 | | 反向用例 |
| TC_REG_006 | 邮箱已被注册 | 邮箱已注册 | 1. 打开注册页面 2. 输入已注册邮箱 `exist@example.com` 3. 输入密码 4. 点击“注册” | 邮箱:exist@example.com 密码:Pass123 确认密码:Pass123 | 提示“邮箱已存在”,不允许注册 | | 反向用例 |
| TC_REG_007 | 用户名格式错误 | 无 | 1. 打开注册页面 2. 输入非法用户名(如 `user@123`) 3. 输入密码 4. 点击“注册” | 用户名:user@123 或 us 或 超过20位的用户名 密码:Pass123 确认密码:Pass123 | 提示“仅支持字母数字”或“用户名需4-20位”,注册失败 | | 反向用例 |
| TC_REG_008 | 用户名已被注册 | 用户名已注册 | 1. 打开注册页面 2. 输入已注册用户名 `existUser` 3. 输入密码 4. 点击“注册” | 用户名:existUser 密码:Pass123 确认密码:Pass123 | 提示“用户名已存在”,注册失败 | | 反向用例 |
| TC_REG_009 | 密码长度不足 | 无 | 1. 打开注册页面 2. 输入用户名 3. 输入短密码 `12345`(5位) 4. 点击“注册” | 用户名:userX 密码:12345 确认密码:12345 | 提示“密码至少6位”,注册失败 | | 反向用例 |
| TC_REG_010 | 两次密码不一致 | 无 | 1. 打开注册页面 2. 输入用户名 3. 输入密码 `Pass123` 4. 输入确认密码 `Pass456` 5. 点击“注册” | 用户名:userY 密码:Pass123 确认密码:Pass456 | 提示“密码不一致”,注册失败 | | 反向用例 |
| TC_REG_011 | 必填字段为空 | 无 | 1. 打开注册页面 2. 留空邮箱/用户名或密码或确认密码 3. 点击“注册”按钮 | 任意字段为空 | 提示“请填写完整信息”,不允许注册 | | 反向用例 |
| TC_REG_012 | 注册后状态异常 | 无 | 1. 打开注册页面 2. 使用合法信息注册成功 3. 登录后进入个人中心检查状态 | 任意注册信息 | 用户状态应为“正常”;如非正常(未激活/锁定)应记录为缺陷 | | 反向用例 |

"""

带图片内容的提示词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import dotenv
import os
from langchain_openai import ChatOpenAI
from langchain.messages import AIMessage, SystemMessage, HumanMessage

# 把.env文件中的配置加载到环境变量中
dotenv.load_dotenv()

# 创建一个多模态大模型
llm = ChatOpenAI(
model=os.getenv("image_model"),
base_url=os.getenv("base_url"),
api_key=os.getenv("api_key"),
)


message = [
{"role": "system", "content": "你是一个资深测试工程师"},
{"role": "user", "content": [
{"type": "text", "text": "请分析图片中的功能需求"},
{"type": "image", "url": "https://pic2.zhimg.com/v2-d1f6399664a2f8837eb4b4a45e4672fd_r.jpg"},
]
}
]

# 和大模型进行对话
result = llm.stream(message)
for chunk in result:
print(chunk.content,end='')