Dify 实战指南:从 Docker 部署到 AI 应用开发,自动化测试全流程解析
·
文章目录
一、下载桌面版docker
brew install --cask docker
二、修改docker配置文件
进入docker-点击设置-改完以后点击apply

{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://mirror.aliyuncs.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io"
]
}
三、下载dify并配置
# 克隆国内镜像仓库
git clone https://gitee.com/langgenius/dify.git
# 进入项目文件夹
cd dify
# 切换到稳定版
git checkout 1.13.3
# 配置dify源代码
cd docker
# 重命名
mv docker docker-dify-1.13.3
# 复制环境模板生成可配置文件
cp .env.example .env
# 启动dify(第一次用时)
docker compose up -d
# 后续直接docker -desktop即可启动dify
四、dify的启动和配置
http://localhost/install
- 第一次启动要设置这些

- 主页面

- 配置大模型
- 点击右上角的图标-设置-模型供应商-选择ollama-点击安装-添加api秘钥(模型名称选择你自己已有的ollama模型

- 点击右上角的图标-设置-模型供应商-选择ollama-点击安装-添加api秘钥(模型名称选择你自己已有的ollama模型
五、用dify创建应用
1、聊天机器人
-
1、在首页点击创建空白应用

-
2、点击新手适用-聊天助手

-
3、写提示词,选择模型

-
4、配置项调整:我们重点关注我圈出来的

-
5、配置完点击发布,我们就可以开始正式聊天啦~ 你可以嵌入网站或者通过接口调用,官网都有详细的文档~

2、agent
你还可以创建一个agent,区别在于agent里面可以调用工具,只要你添加了,使用过程中会直接进行调用

3、工作流
实战:自动生成测试用例
我们还可以添加工作流,这个类似于做任务,做完就结束,不能聊天。如果要反复问的话,就选chatflow,我们先来新建工作流吧
-
1、新建工作流-输入名称和描述-点击创建

-
2、选择用户输入

-
3、点击用户输入,因为我们这边是要添加prd之类的,所以我们选择变量为添加文件,其他的按照图片来吧,点击保存

-
4、点击用户输入旁边那个➕号来新建文档提取器(支持word,excel之类的),这边输入变量选择doc

-
5、点击文档编辑器的➕号,选择新增LLM,选择模型,然后改下配置参数

-
6、接着再写提示词,给一个现成的吧
# 角色:软件测试工程师
## 目标:
根据用户输入的原始软件需求,梳理出核心的测试点
## 工作流:
1. 分析软件的功能需求,深入挖掘原始需求中的显示需求和隐式需求点。
2. 针对每个需求点,设计正向的测试点,包括各种有效的输入和有效边界,确保能覆盖各种满足业务需求的场景。
3. 针对每个需求点,设计反向测试点,包括异常数据、异常操作、无效边界值、空值等,违反业务规则的值等,确保覆盖各种可能的异常情况。
4. 将生成的测试点按照下面<输出格式>的要求输出。
## 输出格式:
以Markdown形式输出所有的测试点,示例:
# 测试点
## 登录模块测试点
- 有效用户名和有效密码是否登录成功
- 有效用户名和无效密码是否登录失败
## 搜索路线测试点
- 起点和终点是否为空时都能正确提示
- 起点和终点是否相同能正确提示
- 首页点击搜索输入框和点击“从哪出发”输入框的跳转功能是否正常
## 限制:
1.只需要设计测试点,不需要完整的测试用例
2.输出格式必须是Markdown格式

也支持添加变量

- 7、点击添加消息-添加用户提示词(点击圈出来的地方,选择文档提取器的text)


- 8、同样的配置再添加一个测试用例的,提示词给你
# 完整提取文本(Dify工作流大模型节点提示词)
## 系统提示词
# 角色
你是一位资深的软件测试专家,善于编写详细测试用例。
## 背景
你需要根据软件测试点,编写详细可执行的测试用例。
## 工作流
1. 分析用户提供的每个测试点。
2. 依次把每个测试点,转换为详细测试用例,内容包含编号、标题、操作步骤、预期结果。如果1条用例无法覆盖测试点,可以写多条用例。
3. 编写用例完成后,检查用例,确保所有测试点全部被用例覆盖。
## 输出格式
二维数组格式,包含多个子数组,每个子数组中有多个元素,包含了用例的编号、标题、操作步骤、预期结果。
### 要求:
1. 第一个子数组为字段名称。从第二个子数组开始,每个子数组代表一个完整用例
2. 用例编号递增,用例标题具备唯一性,包含了一级模块+二级模块+测试场景。
3. 用例中的每个步骤后面加一个换行符`\n`
4. 生成的用例标题、步骤和预期结果中,如果需要用双引号,请使用中文双引号,json本身key和values的双引号必须是英文的
### 示例:
```json
[
["编号","标题","操作步骤","预期结果"],
[
"1",
"购票模块-线路搜索-使用已存在的线路名称搜索",
"步骤1:打开搜索页面;\n步骤2:输入一个已存在的合法线路名称;\n步骤3:点击搜索按钮",
"搜索成功,页面显示对应线路信息"
],
[
"2",
"购票模块-线路搜索-使用不存在的线路名称搜索",
"步骤1:打开搜索页面;\n步骤2:输入一个不存在的合法线路名称;\n步骤3:点击搜索按钮",
"搜索结果为空,页面显示为空"
],
[
"3",
"购票模块-线路搜索-使用空值搜索",
"步骤1:打开搜索页面;\n步骤2:搜索框什么都不输入;\n步骤3:点击搜索按钮",
"页面显示所有的线路信息"
]
]


- 9、点击结束:在llm测试用例节点点击新增-选择输入-其他按照我的截图来,这样一个工作流就搭建好了!!


- 10、开始调试,选择文件,点击开始运行


- 11、觉得ok了就可以点击发布,一个工作流就完成啦!
- 12、运行历史也可以查看哦

- 工作流还支持发布为工具,发布好了以后可以在智能体等地方进行调用(不推荐,其实在工作流里跑也一样)


4、chatflow工作流
实战:多轮聊天构造测试数据
- 本次拿自动生成优惠券举例
- 整体的思路如下:
- 用户输入优惠券业务需求(满减 / 折扣 / 有效期 / 使用范围等)
- LLM 大模型解析自然语言,输出创建优惠券接口标准 JSON 请求参数
[
{
"title": "北河测试999",
"coupon_price": "100",
"coupon_threshold_price": "200",
"start_time": "1744008557",
"end_time": "1744613357",
"create_num": "999",
"limit_num": "1",
"type": "FREE_GET"
},
{
"title": "北河测试999",
"coupon_price": "100",
"coupon_threshold_price": "200",
"start_time": "1744008557",
"end_time": "1744613357",
"create_num": "999",
"limit_num": "1",
"type": "FREE_GET"
}
]
-
HTTP 节点循环调用创建优惠券接口,传入模型生成的参数,完成优惠券创建(sql也可以,就是比较麻烦)
-
提示词:
# 角色
你是一个http接口测试专家,善于根据用户需求构造接口需要的参数
## 背景
用户希望通过http接口批量构造优惠券数据,希望你能理解用户需求,生成需求对应的json格式的接口参数。
## json格式要求
```json
{
"title": "<优惠券名称,默认值:随机生成一个中文+数字名称>",
"coupon_price": "<优惠券面额,默认值:10>",
"coupon_threshold_price": "<优惠券门槛价格,默认是100>",
"start_time": "<生效时间,默认值:当前日期>",
"end_time": "<结束时间,默认值:当前日期后的第7天>",
"create_num": "<发行量,默认值:100>",
"limit_num": "<每人限领数量,默认值:1>",
"type": "<优惠券类型,枚举值,分为免费赠送FREE_GET、活动领取ACTIVE_GET,默认为FREE_GET>"
}
```## 技能
1.善于理解用户需求
2.熟悉http协议
3.熟悉Json数据结构
## 工作流
1.分析用户需求,确定用户想构造几张不同的券
2.参考<json格式要求>,依次构造对应的json参数,如果参数中涉及到当前日期的,当前日期为{{#1743228997040.text#}}
3.将所有的json对象参数放到一个数组中
4.输出最终的json参数数组
## 限制
1.最终构造好的参数必须是一个json数组,如果只有一条数据,也需要放到数组中
2.用户需求中没有涉及到的参数,均采用默认值
3.优惠券门槛价格必须高于优惠券面额
4.生效时间必须小于结束时间
5.输出内容中只包含json,不需要加解释
## 示例
---
用户需求:帮我构造1张面额为500的优惠券
输出json:
[{"title":"优惠券测试123","coupon_price":500,"coupon_threshold_price":600,"start_time":"2025-04-07 00:00:00","end_time":"2025-04-14 00:00:00","create_num":100,"limit_num":1,"type":"FREE_GET"}]
---
用户需求:帮我构造2个不同的优惠券,一个面额是200,门槛是600,发行量10;另外一个面额是300,门槛是500,发行量20
输出json:
[{"title":"优惠券测试666","coupon_price":200,"coupon_threshold_price":600,"start_time":"2025-04-07 00:00:00","end_time":"2025-04-14 00:00:00","create_num":10,"limit_num":1,"type":"FREE_GET"},{"title":"优惠券测试888","coupon_price":300,"coupon_threshold_price":500,"start_time":"2025-04-07 00:00:00","end_time":"2025-04-14 00:00:00","create_num":20,"limit_num":1,"type":"FREE_GET"}]
操作步骤:
- 1、新建一个chatflow工作流

- 2、点击创建后界面如下:

- 3、在llm那边在设置里黏贴刚刚那个提示词,选择对应的模型

- 4、在llm前面新增一个工具,然后选择获取当年时间的组件,配置如下:

- 5、新增一个代码执行(作用:把日期替换为时间戳)

附代码
import json
import re
from datetime import datetime
def main(arg: str) -> dict:
# ====== 第一步:提取最外层的 JSON 数组 ======
# 匹配以 [ 开头,以 ] 结尾的最外层数组
match = re.search(r'\[\s*\{.*?\}\s*\]', arg, re.S)
if not match:
return {"result": "错误:未找到 JSON 数组"}
json_str = match.group(0).strip()
# ====== 第二步:解析 JSON ======
try:
data = json.loads(json_str)
except json.JSONDecodeError as e:
return {"result": f"JSON解析失败: {str(e)}"}
# ====== 第三步:确保是数组 ======
if not isinstance(data, list):
return {"result": "错误:提取的内容不是数组"}
# ====== 第四步:转换时间戳 ======
def convert_to_timestamp(time_str: str) -> int:
if not time_str:
return 0
try:
dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")
return int(dt.timestamp())
except ValueError:
try:
dt = datetime.strptime(time_str, "%Y-%m-%d")
return int(dt.timestamp())
except ValueError:
return 0
for item in data:
if "start_time" in item:
item["start_timestamp"] = convert_to_timestamp(item["start_time"])
if "end_time" in item:
item["end_timestamp"] = convert_to_timestamp(item["end_time"])
# ====== 第五步:返回结果 ======
return {"result": json.dumps(data, ensure_ascii=False)}
- 6、在直接回复节点选择上一个接口返回的result

- 7、点击预览,输入你要的东西,点击对话,它会自动生成你要的测试数据

更多推荐
所有评论(0)