在传统编写 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 自动化测试用例效果如下:
总结
-
Web 自动化测试用例生成工具需求说明。
-
如何通过 LangChain 实现 Web 自动化测试用例生成工具。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。