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

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

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

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

应用价值

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

实践演练

实现原理

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

实现思路

测试用例规范与要求

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

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

1. 打开 https://litemall.hogwarts.ceshiren.com/#/login?redirect=%2Fdashboard
2. 输入用户名 hogwarts
3. 输入密码 test12345
4. 点击登录按钮
5. 进入主页,获取此时的url
6. 执行完成,退出浏览器

通过 AGENT 执行功能测试用例。

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

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

相关知识点: Agent、 tools

  • 封装好 web 的底层工具
class WebAutoFramework:

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

    def init(self):
        if not self.driver:
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(5)

    def open(self, url):
        self.init()

        self.driver.get(url)
        return self.source()

    def source(self):
        return self.driver.execute_script(
            """
            var content="";
            document.querySelectorAll('button').forEach(x=> content+=x.outerHTML);
            document.querySelectorAll('input').forEach(x=> content+=x.outerHTML);
            //document.querySelectorAll('table').forEach(x=> content+=x.outerHTML);
            return content;
            """
        )

    def click(self):
        """
        点击当前的元素
        :return:
        """
        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 find(self, locator):
        print(f"find css = {locator}")
        element = self.driver.find_element(by=By.CSS_SELECTOR, value=locator)
        self.element = element
        return self.source()

    def quit(self):
        self.driver.quit()

    def get_current_url(self):
        print(f"当前的url为{self.driver.current_url}")
        return self.driver.current_url
  • 创建工具以及其说明,并且将工具绑定到工具包中
web = WebAutoFramework()
@tool
def open(url: str):
    """
    使用浏览器打开特定的url,并返回网页内容
    """
    r = web.open(url)
    return r

@tool
def find(css: str):
    """定位网页元素"""
    return web.find(css)

@tool
def click(css: str = None):
    """以css的方式定位网页元素后点击"""
    web.find(css)
    return web.click()

@tool
def send_keys(css, text):
    """定位到css指定的元素,并输入text"""
    web.find(css)
    return web.send_keys(text)

@tool
def sleep(seconds: int):
    """等待指定的秒数"""
    time.sleep(seconds)


@tool
def quit():
    """退出浏览器"""
    web.quit()

@tool
def get_current_url():
    """获取当前的url"""
    return web.get_current_url()

tools = [open, quit, get_current_url, find, click, send_keys]

声明 Agent,并将tools传递过去:

 web_agent = create_structured_chat_agent(llm, tools, prompt)
# Create an agent executor by passing in the agent and tools
web_agent_executor = AgentExecutor(
    agent=web_agent, tools=tools,
    verbose=True,
    return_intermediate_steps=True,
    handle_parsing_errors=True)

执行 Agent:

r = web_agent_executor.invoke({"input": query})

记录执行步骤

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

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

# 获取执行结果
r = agent.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})

生成自动化测试用例。

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

prompt = PromptTemplate.from_template("""
你是一个web自动化测试工程师,主要应用的技术栈为pytest + selenium。
以下为web自动化测试的测试步骤,测试步骤由json结构体描述
{step}

{input}
""")

AGENT 结合 CHAIN

import json

from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.globals import set_debug
from langchain_core.agents import AgentAction
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

from web.selenium_tools import tools

set_debug(True)

prompt = hub.pull("hwchase17/structured-chat-agent")
llm = ChatOpenAI()
web_agent = create_structured_chat_agent(llm, tools, prompt)
# Create an agent executor by passing in the agent and tools
web_agent_executor = AgentExecutor(
    agent=web_agent, tools=tools,
    verbose=True,
    return_intermediate_steps=True,
    handle_parsing_errors=True)

query = """
你是一个自动化测试工程师,接下来需要根据测试步骤,
每一步如果定位都是根据上一步的返回的html操作完成
执行对应的测试用例,测试步骤如下
1. 打开 https://litemall.hogwarts.ceshiren.com/#/login?redirect=%2Fdashboard
2. 输入用户名 hogwarts
3. 输入密码 test12345
4. 点击登录按钮
5. 进入主页,获取此时的url
6. 执行完成,退出浏览器
"""

def web_execute_result(_):
    # 获取执行结果
    r = web_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)

prompt_testcase = PromptTemplate.from_template("""
你是一个web自动化测试工程师,主要应用的技术栈为pytest + selenium。
以下为web自动化测试的测试步骤,测试步骤由json结构体描述

{step}

{input}

""")

chain = (
        RunnablePassthrough.
        assign(step=web_execute_result)
        | prompt_testcase
        | llm
        | StrOutputParser()
)

print(chain.invoke({"input": "请根据以上的信息,给出对应的web自动化测试的代码"}))

执行效果

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

总结

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

推荐学习

【霍格沃兹测试开发】7天软件测试快速入门带你从零基础/转行/小白/就业/测试用例设计实战

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (上集)

【霍格沃兹测试开发】最新版!Web 自动化测试从入门到精通/ 电子商务产品实战/Selenium (下集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(上集)

【霍格沃兹测试开发】明星讲师精心打造最新Python 教程软件测试开发从业者必学(下集)

【霍格沃兹测试开发】精品课合集/ 自动化测试/ 性能测试/ 精准测试/ 测试左移/ 测试右移/ 人工智能测试

【霍格沃兹测试开发】腾讯/ 百度/ 阿里/ 字节测试专家技术沙龙分享合集/ 精准化测试/ 流量回放/Diff

【霍格沃兹测试开发】Pytest 用例结构/ 编写规范 / 免费分享

【霍格沃兹测试开发】JMeter 实时性能监控平台/ 数据分析展示系统Grafana/Docker 安装

【霍格沃兹测试开发】接口自动化测试的场景有哪些?为什么要做接口自动化测试?如何一键生成测试报告?

【霍格沃兹测试开发】面试技巧指导/ 测试开发能力评级/1V1 模拟面试实战/ 冲刺年薪百万!

【霍格沃兹测试开发】腾讯软件测试能力评级标准/ 要评级表格的联系我

【霍格沃兹测试开发】Pytest 与Allure2 一键生成测试报告/ 测试用例断言/ 数据驱动/ 参数化

【霍格沃兹测试开发】App 功能测试实战快速入门/adb 常用命令/adb 压力测试

【霍格沃兹测试开发】阿里/ 百度/ 腾讯/ 滴滴/ 字节/ 一线大厂面试真题讲解,卷完拿高薪Offer !

【霍格沃兹测试开发】App自动化测试零基础快速入门/Appium/自动化用例录制/参数配置

【霍格沃兹测试开发】如何用Postman 做接口测试,从入门到实战/ 接口抓包(最新最全教程)

<think>好的,我现在需要回答用户关于如何使用LangChain框架生成和执行测试用例的问题。首先,我要确保自己正确理解用户的需求。用户提到了引用[1]和引用[2],这些内容涉及LangChain测试用例生成与执行中的应用,特别是自动化测试的实现。用户的问题具体是询问如何利用LangChain实现这一过程,因此我需要结合提供的引用信息,并按照系统级指令中的要求来组织回答。 首先,我需要回顾引用中的内容。引用[1]提到了一个使用RunnablePassthrough和AgentExecutor的链式结构,其中load_case函数用于加载测试用例,然后通过代理执行。引用[2]则介绍了测试用例设计方法的枚举类型,包括等价类和因果图方法,并提到集成到测试平台的可能性。 接下来,我需要将这些信息结构化,分步骤解释生成与执行测试用例的过程。根据系统指令,回答需要结构清晰,逐步解决问题,并引用相关段落。同时,要确保正确使用LaTeX格式,例如行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,主要关注代码和流程。 首先,可能需要分步骤说明:测试用例生成测试用例加载、执行测试用例。每个步骤需要结合引用中的代码示例,比如引用[1]中的chain和agent_executor的设置,以及引用[2]中的DesignType枚举类。 然后,需要确保代码块正确展示,比如Python代码的语法是否正确,是否有必要的解释。例如,在引用[1]中,代码展示了如何通过RunnablePassthrough分配code变量,然后执行代理。这部分需要解释每个组件的作用,如RunnablePassthrough、agent1、tools_all等。 另外,用户可能关心如何选择不同的测试用例设计方法,比如等价类或因果图,这需要引用[2]中的DesignType枚举,说明如何集成到生成过程中。 还要注意系统指令中的要求,比如生成相关问题,需要提出三个相关问题,可能涉及性能优化、集成方法、异常处理等。 在组织回答时,要确保每个部分引用正确的来源,如引用[1]和引用[2],并在末尾添加引用标识。同时,检查是否有遗漏的步骤,例如是否需要配置环境、如何处理测试结果等,但根据提供的引用,可能主要聚焦于生成和执行的代码结构。 最后,确保回答符合中文语言要求,避免使用Markdown格式,使用自然的口语化表达,同时保持逻辑清晰和技术准确性。需要验证所有步骤是否覆盖用户的问题,并正确引用提供的资料,避免添加未提及的内容。</think>### 如何使用 LangChain 实现测试用例生成与自动执行 #### 一、测试用例生成与执行的实现步骤 1. **测试用例生成** LangChain 通过定义测试用例设计方法的枚举类型(如等价类、因果图)实现灵活选择生成策略。例如引用[2]中定义的`DesignType`类: ```python class DesignType(Enum): EP = "等价类测试用例设计" CE = "因果图测试用例设计" ``` 通过大模型(如集成 Spark 3.0)解析需求文档,生成符合选定方法的测试用例[^2]。 2. **测试用例加载与绑定** 使用`RunnablePassthrough`将生成测试用例加载到执行链中。引用[1]中的代码展示了如何通过`load_case`函数加载用例并绑定到链式操作: ```python chain = ( RunnablePassthrough.assign(code=load_case) | agent1 ) ``` 此步骤将生成测试用例换为可执行的代码逻辑[^1]。 3. **执行测试用例** 通过`AgentExecutor`实现自动化执行,支持工具集成和中间步骤追踪: ```python agent_executor = AgentExecutor( agent=chain, tools=tools_all, verbose=True, return_intermediate_steps=True, handle_parsing_errors=True ) agent_executor.invoke({"input": "执行测试用例"}) ``` 执行结果会包含测试通过率、失败原因等详细信息[^1]。 #### 二、关键组件说明 - **`load_case`函数**:需提前实现用例加载逻辑(如从文件或数据库读取),返回结构化测试数据[^1]。 - **工具集成(`tools_all`)**:可包含 HTTP 请求工具、断言库等,用于实际接口调用和结果验证。 - **错误处理**:`handle_parsing_errors=True`确保执行过程中语法或逻辑错误能被捕获并反馈。 #### 三、典型应用场景 1. **接口自动化测试**:将手工测试用例换为自动化脚本(如引用[1]中描述的工具)。 2. **多方法测试设计**:根据需求动态选择等价类或因果图方法生成用例(如引用[2]中的枚举类型)。 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值