引言:自动化测试的新曙光

在当今软件开发的快节奏赛道上,自动化测试已然成为保障软件质量、加速交付进程的关键力量。随着技术的持续革新,测试领域也在不断探索更为高效、智能的解决方案。Dify 作为自动化测试领域的一颗新星,以其强大的功能和灵活的架构,为众多开发者提供了便捷高效的测试体验。而当 Dify 与 Skyvern 深度融合,一场自动化测试的革命就此拉开帷幕,为我们带来了前所未有的测试新玩法和新增功能 ,极大地提升了测试效率与质量。

一、传统自动化测试的困境剖析

在软件行业发展的进程中,传统自动化测试曾经发挥了不可替代的重要作用,极大地提升了软件测试的效率,让测试工作从大量的重复劳动中解脱出来。然而,随着软件系统的日益复杂以及用户需求的快速迭代,传统自动化测试逐渐暴露出诸多难以克服的困境 ,这些问题严重制约了测试工作的高效开展。

(一)元素定位与操作的难题

在传统自动化测试中,对网页元素的定位和操作依赖于相对固定的属性和定位策略,如通过 ID、XPath、CSS 选择器等方式来寻找和操作元素。一旦网页的结构、样式或者元素属性发生细微变化,就可能导致原本稳定的定位方式失效,测试脚本也随之 “断裂” 。比如,前端开发人员为了优化页面布局,修改了某个按钮的 class 名称,原本基于该 class 定位按钮的测试脚本就无法准确找到该按钮,从而导致测试失败。据相关数据统计,在一些频繁更新的项目中,因元素定位问题导致的测试脚本维护工作量,每周甚至会耗费 1 - 2 人天的时间 ,这无疑极大地增加了测试成本和时间开销。此外,在面对一些复杂的页面结构,如嵌套多层的 iframe 框架、动态加载的元素时,传统的定位方式往往显得力不从心,需要编写大量复杂的代码来实现准确的定位和操作,进一步增加了测试脚本的编写和维护难度。

(二)应对网页变化的滞后性

现代软件开发普遍采用敏捷开发模式,软件产品需要快速迭代以满足市场需求。这就导致网页的更新频率大幅提高,可能每天都会有新的功能上线、页面布局调整或者交互方式改变。而传统自动化测试脚本缺乏对网页变化的自适应能力,每次网页发生变化,测试人员都需要手动去检查和更新测试脚本,以确保其能够继续正常运行。这种滞后的响应方式不仅严重影响了测试效率,还可能导致一些潜在的缺陷在测试过程中被遗漏。例如,当一个新的弹窗广告出现在页面上时,可能会遮挡住原本需要操作的元素,而传统的测试脚本无法自动识别并处理这种情况,从而导致测试结果不准确 。而且,在实际项目中,由于测试人员需要同时维护大量的测试脚本,面对频繁的网页变化,很难做到及时、全面地更新所有脚本,这就使得测试的覆盖率和准确性难以得到有效保障 。

(三)测试脚本维护成本高

传统自动化测试脚本通常是基于特定的编程语言和测试框架编写而成,这就要求测试人员具备一定的编程技能和对框架的深入理解。随着项目的不断推进和功能的不断增加,测试脚本的数量和复杂度也会呈指数级增长,维护这些脚本的难度和成本也随之水涨船高。一方面,修改一个测试脚本可能会影响到其他相关的脚本,导致牵一发而动全身的情况,增加了调试和修复的难度;另一方面,当测试人员发生变动时,新接手的人员需要花费大量的时间来熟悉和理解现有的测试脚本,这也会对项目的测试进度产生不利影响 。此外,不同的测试框架和工具之间可能存在兼容性问题,在整合和维护多个测试框架的脚本时,也会遇到诸多困难,进一步加剧了测试脚本维护的复杂性。

二、Dify 与 Skyvern 融合的技术架构

2.1 整体架构设计

Dify 与 Skyvern 融合的技术架构是一个高度协同、分工明确的体系,旨在充分发挥两者的优势,实现高效、智能的自动化测试 。

Skyvern 则专注于网页自动化操作和元素识别,是整个架构中的 “执行先锋” 。它依托先进的视觉大模型和计算机视觉技术,实现对网页元素的精准定位和操作 。在测试过程中,Skyvern 就像一个不知疲倦且精准高效的机器人,严格按照 ollama 生成的测试用例,在网页上进行各种操作 。它能够准确地识别出网页中的各种元素,如按钮、输入框、下拉菜单等,并且不受元素定位方式变化的影响 。即使网页元素的 ID、class 名称或者位置发生改变,Skyvern 也能凭借其对网页视觉特征和语义信息的理解,快速找到目标元素并执行相应的操作,确保测试的稳定性和可靠性 。在测试一个在线商城的购物车功能时,无论添加商品按钮的样式和位置如何变化,Skyvern 都能准确识别并点击该按钮,将商品添加到购物车中 。

2.2 数据交互流程

当测试人员在 Dify 平台上发起一个自动化测试任务时,数据交互流程便正式启动 。首先,测试人员将测试需求以自然语言的形式输入到 Dify 中 。这个需求描述可以是对某个软件功能的详细测试要求,如 “测试在线支付功能,涵盖不同支付方式(银行卡、支付宝、微信)的正常支付、支付金额限制、支付失败后的提示信息等情况” 。

Skyvern 接收到 Dify 发送的操作指令后,利用视觉大模型和计算机视觉技术,对网页进行元素识别和操作 。它会在网页上准确找到对应的元素,并按照指令执行相应的操作 。在执行操作的过程中,Skyvern 会实时将操作结果反馈给 Dify 。如果成功点击了银行卡支付选项,Skyvern 会向 Dify 报告操作成功;如果在寻找元素时遇到问题,如元素未找到,Skyvern 会将错误信息发送给 Dify 。

测试人员可以根据报告中的信息,了解测试的整体情况,包括哪些测试用例通过、哪些未通过以及未通过的原因,从而对软件进行进一步的优化和改进 。整个数据交互流程环环相扣,各个环节紧密协作,确保了自动化测试的高效、准确执行 。

三、融合后的自动化测试新玩法实操

3.1 环境搭建与准备

参考文章

Dify安装篇

https://blog.csdn.net/xy345382605/article/details/159726635?fromshare=blogdetail&sharetype=blogdetail&sharerId=159726635&sharerefer=PC&sharesource=xy345382605&sharefrom=from_link

Skyvern安装篇

https://blog.csdn.net/xy345382605/article/details/159731641?fromshare=blogdetail&sharetype=blogdetail&sharerId=159731641&sharerefer=PC&sharesource=xy345382605&sharefrom=from_link

集成篇

https://blog.csdn.net/xy345382605/article/details/159732579?fromshare=blogdetail&sharetype=blogdetail&sharerId=159732579&sharerefer=PC&sharesource=xy345382605&sharefrom=from_link

3.2 配置工作流节点

以用户登录后,新增功能流程测试为例,展示如何在 Dify 中配置工作流节点来调用 Skyvern 进行测试 。首先,

第一步:登录到 Dify 平台,创建一个新的工作流

注:若增删改查一起的话,只需要维护一次。已有的话,这一步可以跳过。

在工作流设计界面中,添加一个 “开始” 节点,这是整个测试流程的起点 。在 “开始” 节点中,可以添加输入变量,比如 “测试需求描述”,用于输入新增功能测试的具体要求,如 “新增部门,cs01,测试部,测试等场景” 。

第二步:添加条件分支

为 了后续一个工作流中实现增删改查功能

第三步:添加代码结点

(1)输入

变量名user_input

(2)代码

def main(user_input):

    # 按中文逗号分割

    parts = user_input.split(',')

   

    # parts[0] = "修改部"

    # parts[1] = "测试部" (旧名称)

    # parts[2] = "研发部" (新名称)

   

    old_name = parts[1].strip() if len(parts) > 1 else "测试部"

    new_name = parts[2].strip() if len(parts) > 2 else "研发部"

   

    steps = f"""打开 http://192.168.0.130/ceshi

输入用户名 admin

输入密码 admin123

点击登录按钮

等待5秒

打开 http://192.168.0.130/ceshi/#/system/department

等待5秒

在搜索框输入 {old_name}

等待2秒

点击查询

等待2秒

点击编辑

等待2秒

部门名称 {new_name}

点击保存

等待2秒

验证 保存成功"""

   

    return {"description": steps}

(3)输出

变量名:description

第四步:添加一个 HTTP 请求节点,用于调用 Skyvern 的 API

在 HTTP 请求节点的配置中,设置 API POST 地址为 Skyvern 的服务地址 。例如,如果 Skyvern 服务运行在本地的 8081 端口,那么 API POST 地址就设置为 “http://localhost:8081/api/automation” 。设置 HEADERS,键为 “Content-Type”,值为 “application/json”,表示请求的数据格式为 JSON 。在 BODY 部分,选择 JSON 格式,并根据 Skyvern 的 API 要求,输入具体的测试指令和参数 。对于新增功能流程测试,可能需要涉及输入框的定位信息(可以是视觉特征描述,由 Skyvern 通过视觉大模型理解)、部门代码输入框的定位信息以及确定按钮的定位信息等 。比如:

这里是skyvern_server.py部分代码,这些代码我们可以通过ai生成

                    # 点击编辑
                    elif '点击编辑' in step or ('编辑' in step and '点击' in step) or step == '编辑':
                        print(f"  Clicking edit button")
                        if search_keyword:
                            print(f"    Looking for row containing: {search_keyword}")
                            rows = page.locator('tr').all()
                            for row in rows:
                                row_text = row.text_content()
                                if search_keyword in row_text:
                                    print(f"    Found target row")
                                    edit_btn = row.locator("button:has-text('编辑')")
                                    if edit_btn.count() > 0:
                                        edit_btn.click()
                                        print(f"    Clicked edit button")
                                        break
                        else:
                            edit_btn = page.locator("button:has-text('编辑')").first
                            edit_btn.click()
                        time.sleep(2)
                        ss = os.path.join(SCREENSHOT_DIR, f"step{step_num}_click_edit.png")
                        page.screenshot(path=ss)
                        results["screenshots"].append(ss)

第五步:添加报告结点

(1)输入变量

变量名:input_data ;变量值:HTTP请求的body值

(2)代码

def main(input_data):

    import json

   

    # 解析输入

    if isinstance(input_data, dict):

        body = input_data.get("input_data", "{}")

    else:

        body = str(input_data)

   

    # 解析 JSON

    try:

        if isinstance(body, str):

            result = json.loads(body.strip())

        else:

            result = body

    except Exception as e:

        result = {"status": "unknown", "message": str(body)}

   

    # 提取数据

    status = result.get("status", "unknown")

    message = result.get("message", "")

    report_url = result.get("report_url", "")

   

    # 状态图标

    status_icon = "✅" if status == "success" else "❌"

    status_text = "通过" if status == "success" else "失败"

   

    # 生成报告内容

    if report_url:

        report_content = f"""

## 测试结果

- **状态**: {status_icon} {status_text}

- **信息**: {message}

- **详细报告**: [点击查看]({report_url})

"""

    else:

        report_content = f"""

## 测试结果

- **状态**: {status_icon} {status_text}

- **信息**: {message}

- **截图数量**: {len(result.get('screenshots', []))} 张

"""

   

    return {

        "result": report_content

    }

(3)输出变量

变量名:result

第六步:添加一个 “结束” 节点

报告结点的输出变量设置为 “结束” 节点的输出变量值,以便在测试完成后获取和分析测试结果 。通过这样的配置,Dify 就可以按照设定的工作流,调用 Skyvern 对新增功能流程进行自动化测试 。

3.3配置完整图

3.4 运行测试与结果分析

完成工作流节点的配置后,就可以运行测试了 。在 Dify 平台的工作流界面中,点击 “运行” 按钮,启动自动化测试 。Dify 会按照工作流的设定,将测试任务发送给 Skyvern,Skyvern 接收到任务后,利用视觉大模型和计算机视觉技术对网页进行元素识别和操作,执行测试场景 。在测试过程中,可以在 Dify 平台上实时监控测试进度,查看每个测试步骤的执行情况 。

当测试完成后,Dify 会收集 Skyvern 返回的测试结果,并生成详细的测试报告 。测试报告中通常包含测试用例的执行情况,哪些用例通过,哪些用例失败;每个测试步骤的操作记录,包括操作的元素、执行的动作和输入的数据;以及详细的错误信息,如果有测试用例失败,会说明失败的原因,如元素未找到、操作执行失败、实际结果与预期结果不一致等 。

点击查看,就可以查看测试报告

在分析测试结果时,首先要关注测试用例的通过率 。如果通过率较低,需要仔细查看失败的测试用例和对应的错误信息 。如果是因为元素未找到导致测试失败,可能是网页结构发生了变化,或者 Skyvern 对元素的视觉识别出现了问题,需要检查元素的定位描述是否准确,或者调整视觉大模型的参数 。如果是操作执行失败,可能是操作步骤的顺序有误,或者网页存在一些特殊的交互逻辑,需要重新审视测试场景和操作步骤 。对于实际结果与预期结果不一致的情况,要分析是软件本身存在缺陷,还是预期结果的设定不合理 。根据分析结果,对测试策略进行优化,如调整测试用例、修改元素定位方式、完善操作步骤等,以提高测试的准确性和有效性 。

在追踪里面可以查看每个结果的详情

实战结果

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐