首页 > 其他分享 >基于LangChain手工测试用例转App自动化测试生成工具

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

时间:2024-09-19 18:26:49浏览次数:11  
标签:appium return App LangChain self 测试用例 app def

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

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

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

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

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

应用价值

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

实践演练

实现原理

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

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

实现思路
测试用例规范与要求

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

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

打开  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 AppiumBy

class AppAutoFramework:
    def __init__(self):
        self.driver = None
        self.element = None

    def init(self, app_activity, app_package):
        if not self.driver:
            # 设置 capability
            caps = {
                # 设置 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
            }
            # 初始化 driver
            self.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_source

    def find(self, locator):
        print(f"find xpath = {locator}")
        element = self.driver.find_element(by=AppiumBy.XPATH, value=locator)
        self.element = element
        return 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 time

from langchain_core.tools import tool

app = 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 ChatOpenAI

from app.appium_tools import tools

prompt = 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 自动化测试用例效果如下:

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

总结

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

标签:appium,return,App,LangChain,self,测试用例,app,def
From: https://blog.51cto.com/u_15640304/12058122

相关文章

  • 基于LangChain手工测试用例转App自动化测试生成工具
    在传统编写App自动化测试用例的过程中,基本都是需要测试工程师,根据功能测试用例转换为自动化测试的用例。市面上自动生成Web或App自动化测试用例的产品无非也都是通过录制的方式,获取操作人的行为操作,从而记录测试用例。整个过程类似于但是通常录制出来的用例可用性、可维护性......
  • 软件测试用例篇
    目录一、测试用例的概念二、设计测试用例的万能公式1. 常规思考+逆向思维+发散性思维2.万能公式3.弱网测试&&安装卸载测试一、测试用例的概念什么是测试用例?        测试用例(TestCase)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环......
  • 测试用例设计方法
    目录1. 基于需求的设计方法2.具体的设计方法2.1等价类2.2边界值2.3正交法2.4判定表法2.4场景法2.5错误猜测法3.用例练习命令行程序 1. 基于需求的设计方法        基于需求的设计方法也是总的设计测试用例的方法,在工作中,我们需要参考需求文......
  • 短剧平台搭建小程序APP开发
    短剧平台搭建小程序APP开发(张先生:13101716752微电)出海短剧项目设计丶短剧系统APP源码以下是关于短剧平台搭建(小程序和APP开发)的一些要点:一、需求分析用户端需求短剧观看体验提供流畅的视频播放功能,支持多种视频格式,确保不同短剧在各种网络条件下都能正常播放,具有高清画......
  • 基于LangChain手工测试用例转App自动化测试生成工具
    在传统编写App自动化测试用例的过程中,基本都是需要测试工程师,根据功能测试用例转换为自动化测试的用例。市面上自动生成Web或App自动化测试用例的产品无非也都是通过录制的方式,获取操作人的行为操作,从而记录测试用例。整个过程类似于但是通常录制出来的用例可用性、可维护......
  • 预约问诊APP开发指南:基于互联网医院系统源码的实践方案
    本篇文章,小编将深入探讨如何基于互联网医院系统源码开发预约问诊APP,帮助开发者更好地理解实践中的关键环节与技术方案。 一、互联网医院系统源码的核心功能在开发预约问诊APP之前,理解互联网医院系统源码的核心功能是第一步。通常,成熟的互联网医院系统源码包含以下几个模块:-用户管......
  • happiness(栈)
    happiness(栈)//happiness#include<stdio.h>#include<stdlib.h>#defineMAX_N100000//函数声明intmax_happiness(intn,intw[]);intmain(){ intn; //输入物品数量 scanf("%d",&n); //输入每个物品的满意度 intw[MAX_N]; for(inti=......
  • 易优eyoucms网站报错 \core\library\think\App.php Fatal error: Call to undefin
    当你遇到 Fatalerror:Calltoundefinedfunctionthink\switch_citysite() 这样的错误时,说明在代码中调用了一个未定义的函数 think\switch_citysite()。这种情况通常是因为函数没有被正确地引入或者该函数根本不存在于当前的代码库中。解决方案确认函数的存在检查 s......
  • Uniapp生命周期
    UniApp框架中的生命周期函数主要分为两大类:页面生命周期和组件生命周期。页面生命周期:onLoad:页面加载时触发。onShow:页面显示时触发。onReady:页面初次渲染完成时触发。onHide:页面隐藏时触发。onUnload:页面卸载时触发。onPullDownRefresh:用户......
  • 人像评测测试用例典型场景
    在**人像评测**中,通常会针对拍摄人像时的设备表现进行一系列实际场景测试。目的是评估设备在不同条件下拍摄人像的能力,包括细节、色彩、光线处理等方面。以下是一些典型的**人像评测场景用例**:###1.**自然光下的室外拍摄**-**场景描述**:测试在白天的自然光条件下设备的人像......