基于LangChain手工测试用例转App自动化测试生成工具

news/2024/9/19 17:55:35/文章来源:https://www.cnblogs.com/hogwarts/p/18421075

在传统编写 App 自动化测试用例的过程中,基本都是需要测试工程师,根据功能测试用例转换为自动化测试的用例。市面上自动生成 Web 或 App 自动化测试用例的产品无非也都是通过录制的方式,获取操作人的行为操作,从而记录测试用例。整个过程类似于

但是通常录制出来的用例可用性、可维护性都不强,而且依然需要人手工介入录制的过程。

在 LLM 问世之后,我们便在探索,是否有第二种可能性,由大模型执行功能测试用例,生成自动化测试用例?

在前面的章节 基于 LangChain 手工测试用例转 Web 自动化测试生成工具中,给大家讲解了手工用例转 Web 自动化测试用例的过程,而 App 自动化测试用例生成的原理也基本类似。

应用价值

测试工程师在编写用例的过程中,将操作步骤明确的表达出来。即可通过大模型将功能测试用例可以直接转为 App 自动化测试用例。极大的节省了人力与资源。

实践演练

实现原理

整个实现原理如下图所示:

实现思路

测试用例规范与要求

如果想要将功能用例转换为自动化测试用例,那么对功能测试用例则需要清晰,明确的表达出来每个操作步骤。如果测试用例本身就表达的含糊不清,那么自然大模型是无法识别它需要进行的具体的操作步骤的。

如下所示,为一个测试步骤。在这些测试步骤中,具体打开哪些页面,输入哪些信息,点击哪些按钮都清晰的表达了出来。

打开  app activity ".Settings" , app package com.android.settings
2. 点击 Battery
3. 获取 Battery 的电量
4. 返回上一级页面
通过 AGENT 执行功能测试用例。

大模型本身是不具备任何执行能力或生成能力的,它只会”思考“,但是通过 LangChain 的 Agent,可以将一些”工具”外挂到大模型身上。

那么如果要执行这些功能测试用例,大模型就需要具备执行用例的能力。而我们要做的事情,就是将 tools(工具包),外挂到大模型上面。

相关知识点:Agent、 tools

  • 封装好 App 的底层工具

from time import sleep
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumByclass AppAutoFramework:def __init__(self):self.driver = Noneself.element = Nonedef init(self, app_activity, app_package):if not self.driver:# 设置 capabilitycaps = {# 设置 app 安装的平台(Android、iOS)"platformName": "android",# 设置 appium 驱动"appium:automationName": "uiautomator2",# 设置设备名称"appium:deviceName": "emulator-5554","appium:noReset": True,# 设置以下两个参数来控制启动app和关闭掉app"appium:forceAppLaunch" : True,"appium:shouldTerminateApp" : True,# 设置 app 的包名"appium:appPackage": app_package,# 设置 app 启动页"appium:appActivity": app_activity}# 初始化 driverself.driver = webdriver.Remote("http://localhost:4723",options=UiAutomator2Options().load_capabilities(caps))self.driver.implicitly_wait(5)return self.source()def source(self):return self.driver.page_sourcedef find(self, locator):print(f"find xpath = {locator}")element = self.driver.find_element(by=AppiumBy.XPATH, value=locator)self.element = elementreturn self.source()def click(self):self.element.click()sleep(1)return self.source()def send_keys(self, text):self.element.clear()self.element.send_keys(text)return self.source()def back(self):self.driver.back()return self.source()
  • 创建工具以及其说明,并且将工具绑定到工具包中

import timefrom langchain_core.tools import toolapp = AppAutoFramework()@tool
def init(app_activity, app_package):"""打开app的安装包,并返回app的resource"""return app.init(app_activity, app_package)@tool
def find(xpath: str):"""通过xpath定位元素"""return app.find(xpath)@tool
def click(xpath: str = None):"""以xpath的方式定位网页元素后点击"""app.find(xpath)return app.click()@tool
def send_keys(xpath, text):"""定位到xpath指定的元素,并输入text"""app.find(xpath)return app.send_keys(text)@tool
def sleep(seconds: int):"""等待指定的秒数"""time.sleep(seconds)@tool
def back():"""返回上一级界面:return:"""app.back()tools = [init, find, click, send_keys, sleep, back]
记录执行步骤

在 Agent 的配置中,可以要求 agent 将所有的执行步骤记录下来。而执行记录会记录在返回结果中的intermediate_steps中。

而我们则需要将这些步骤取出来,按照我们的需求记录下来。


# 获取执行结果
import json
from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain_core.agents import AgentAction
from langchain_openai import ChatOpenAIfrom app.appium_tools import toolsprompt = hub.pull("hwchase17/structured-chat-agent")
llm = ChatOpenAI()
app_agent = create_structured_chat_agent(llm, tools, prompt)
# Create an agent executor by passing in the agent and tools
app_agent_executor = AgentExecutor(agent=app_agent, tools=tools,verbose=True,return_intermediate_steps=True,handle_parsing_errors=True)query = """
你是一个自动化测试工程师,接下来需要根据测试步骤,
每一步如果定位都是根据上一步的返回的html操作完成
执行对应的测试用例,测试步骤如下
1. 打开  app activity ".Settings" , app package com.android.settings
2. 点击 Battery
3. 获取 Battery 的电量
4. 返回上一级页面
"""def execute_result(_):# 获取执行结果r = app_agent_executor.invoke({"input": query})# 获取执行记录steps = r["intermediate_steps"]steps_info = []# 遍历执行步骤,获取每一步的执行步骤以及输入的信息。for step in steps:action = step[0]if isinstance(action, AgentAction):steps_info.append({'tool': action.tool, 'input': action.tool_input})return json.dumps(steps_info)if __name__ == '__main__':print(execute_result(""))
生成自动化测试用例。

拥有执行步骤之后,可以将执行步骤传递给大模型,然后让大模型根据执行步骤直接生成 web 自动化测试用例。


prompt_testcase = PromptTemplate.from_template("""
你是一个app自动化测试工程师,主要应用的技术栈为pytest + appium。
以下为app自动化测试的测试步骤,测试步骤由json结构体描述{step}{input}""")chain = (RunnablePassthrough.assign(step=execute_result)| prompt_testcase| llm| StrOutputParser()
)print(chain.invoke({"input": "请根据以上的信息,给出对应的app自动化测试的代码"}))

执行效果

最后,自动生成的 App 自动化测试用例效果如下:

总结

  1. App 自动化测试用例生成工具需求说明。
  2. 如何通过 LangChain 实现 App 自动化测试用例生成工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799992.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单细胞数据 存储方式汇总

(单细胞下游分析——不同类型的数据读入,与部分数据类型的转化) .h5ad(anndata 数据格式) 10x_mtx(cell ranger输出,三个文件) 就是cell ranger上游比对分析产生的3个文件: ├── xxx_feature_bc_matrix │ ├── barcodes.tsv.gz:细胞标签(barcode) │ ├──…

springcloud组件openfeign超时时间设置

openfeign超时时间设置有两种方式 1、通过配置类;2、通过配置文件 1、使用配置类代码如下:@Configuration public class FeignConfig {@Beanpublic Request.Options options(){//第一个参数是连接超时时间,第二个参数是处理超时时间return new Request.Options(5000,3000);}…

python虚拟环境venv

创建目录 mkdir pyenv 进入 cd pyenv 初始化环境 python3 -m venv .进入bin目录 jihan@jihandeMacBook-Pro pyenv % cd bin jihan@jihandeMacBook-Pro bin % ls Activate.ps1 activate activate.csh activate.fish pip pip3 pip3.12 python python3 python3.12 jihan@jiha…

进行网站监控有必要吗?

在当今数字化高速发展的时代,网站已经成为了企业、组织乃至个人展示自身形象、提供服务、进行交流互动的重要平台。那么,进行网站监控有必要吗?答案无疑是肯定的。 进行网站监控,首先是保障用户体验的关键。对于访问网站的用户来说,他们期望能够快速、稳定地获取所需信息或…

Typora+picgo+jsDelivr实现免费图床

Typora+picgo+github+jsDelivr实现免费图床 需求 typora中写markdown图片是保存在本地的,为了简化写博客时繁琐的插入图片步骤,直接使用typora+picgo将图片上传到云端,这样发博客就只要复制markdown即可 步骤 前期准备:github中创建一个仓库用于保存图片 名字随便填就行1.下…

线上间歇性卡顿问题

事情起因 最近一段时间我们公司有个项目是做视力筛查的,平时都是正常的,但是最近这两天突然会时不时地卡顿一下,一卡就是几分钟。排查过程 1.查看日志 卡顿首先是排查日志,日志报的是feign调用学生服务超时,进到学生服务查看时,看到日志报的是事务超时2.继续排查,既然是…

关于springcloud中openfeign中服务调用日志输出

在使用openfeign进行服务调用的时候,我们可以通过一些配置,获取到服务调用的日志输出,可以从消费端看到日志 有两种方法:一、使用配置类;二、使用配置文件配置 日志输出级别有四种: NONE:不输出(默认) BASIC:只输出请求方式、url、请求成功与否 HEADERS:输出请求头的…

《现代操作系统》第10章——实例研究1:UNIX、Linux和Android

《现代操作系统》第 10 章——实例研究 1:UNIX、Linux 和 Android 10.1 UNIX 与 Linux 的历史 第一次使 UNIX 的两种流派一致的严肃尝试来源于 IEEE(它是一个得到高度尊重的中立组织)标准委员会的赞助。有上百名来自业界、学界以及政府的人员参加了此项工作。他们共同决定将…

linux使用yum命令报错Cannot find a valid baseurl for repo: base/7/x86_64

【问题】 在VMware上安装搭建centOS 7虚拟机,配置好网络后,尝试通过yum命令进行安装docker容器。执行命令报错: 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile  Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea…

研发工程师的「第一性原理」思维

回顾复盘五年来的研发经历,愈发认同身边同事强调的“第一性原理”思维,仅做浅浅记录和分享一、定义与理论介绍第一性原理(First Principles),又称基本原理,是指从最基本的假设和定义出发,通过逻辑推理和演绎得出结论的一种思维方法。它强调对事物的本质和根源进行深入的…

Meta Llama3 论文研读

一、 引言概述(Intro & Overview) Llama3是一系列基于Transformer结构的大型多语言模型,通过优化数据质量、训练规模和模型架构,旨在提升模型在各种语言理解任务中的表现。通过引入更优质的数据和更高效的训练方法,Llama3展示了在自然语言处理领域的巨大潜力。其创新点…

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

本次研讨会经纬恒润将结合业务团队多年来在SOA架构开发和工具实施领域的项目实践经验,分享探讨SOA趋势下先进的整车EE架构开发模式,聚焦在SOA开发难点分析、开发阶段划分、开发工具链的适配与应用等内容。9月26日,我们在直播间期待您的参与! 面向服务的架构(Service…