一、下载桌面版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模型
      在这里插入图片描述

五、用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、点击预览,输入你要的东西,点击对话,它会自动生成你要的测试数据
    在这里插入图片描述

更多推荐