接口自动化测试用例是一个老生常谈的问题,在未引入人工智能之前,也有非常多的生成方案,比如如下所示,通过har生成接口自动化测试用例:
但是以上的生成方式依然是有一些弊端,比如 har 本身虽然能表述一定的接口信息和业务信息,但是毕竟无法用来表述全部的应用场景与用例场景。而大部分的应用场景和用例场景,均是通过自然语言进行描述的。而解析自然语言,则是大语言模型擅长做的事情。
实践演练
需求说明
以下内容为3条接口测试用例:
测试模块 | 测试标题 | 测试步骤 | 预期结果 |
---|---|---|---|
接口功能 | 正常情况下的请求 | 发送一个正常的GET请求 | 响应状态码为 200 ,并返回请求者的IP地址 |
接口功能 | 非法请求方法 | 发送一个非GET请求,如POST或者PUT | 响应状态码为 405 |
接口功能 | 无效的请求路径 | 发送一个不存在的路径 | 响应状态码为404 |
以下为一个获取ip接口的har文件:
- 接口Har文件(需要可留言领取)
实现原理
接下来,将通过这两个数据文件自动生成对应的测试用例。
通过功能用例生成测试脚本
在这个过程中,测试用例本身是自然语言,自然语言的解析与处理本身就是大模型非常擅长的工作。而可以通过 LangChain 简化整个的实现的过程。
编写的提示词模版信息如下所示:
template = """``你是一个自动化测试工程师,精通的技术栈为 Python pytest requests库``以下是这个接口的具体信息,`` ``{context}`` ``Question: {input}"""``
通过功能测试用例生成的自动化测试脚本如下所示:
#1. Test case: 正常情况下的请求``import pytest``import requests`` ``def test_normal_request():` `url = 'http://example.com/normal_request'` `response = requests.get(url)` `assert response.status_code == 200` `assert response.json()['ip_address'] == 'requester_ip'``#2. Test case: 非法请求方法``import pytest``import requests``def test_invalid_request_method():` `url = 'http://example.com/invalid_request_method'` `response = requests.post(url)` `assert response.status_code == 405``# 3. Test case: 无效的请求路径``import pytest``import requests``def test_invalid_request_path():` `url = 'http://example.com/invalid_request_path'` `response = requests.get(url)` `assert response.status_code == 404``
当然,在此过程中可以很明显的发现,自动生成的用例是没有任何的接口信息的。原因是我们给到的数据里面就是没有接口信息的。
填充接口数据
接下来,将读取har文件中的接口数据信息,和脚本进行结合。
提示词模版如下:
template = """` `你是一个自动化测试工程师,你非常熟悉requests库` `{context}` `Question:`` 请根据传入的接口信息提取request中的 ip 、 url 、method、json。` `key值为前面提到的字段,如果没有则无需添加。如果有则提取对应的value。` `要求返回的格式为json格式``"""
生成结果如下:
{` `"ip": "182.92.156.22",` `"url": "https://httpbin.ceshiren.com/ip",` `"method": "GET"``}
完整代码
再将以上的过程结合之后,完整版的代码如下所示
from langchain_community.chat_models.openai import ChatOpenAI``from langchain_community.document_loaders.text import TextLoader``from langchain_core.output_parsers import JsonOutputParser, StrOutputParser``from langchain_core.prompts import PromptTemplate``from langchain_core.runnables import RunnablePassthrough``from utils.langchain_debug import langchain_debug`` ``langchain_debug()``llm = ChatOpenAI()`` `` ``def get_by_filename(filename):` `info = TextLoader(f'./data/{filename}')` `return info.load()`` `` ``def get_case_data(_):` `template = """` `你是一个自动化测试工程师,你非常熟悉requests库` `{context}` `Question: {input}` `请根据传入的接口信息提取request中的 ip 、 url 、method、json。` `key值为前面提到的字段,如果没有则无需添加。如果有则提取对应的value。` `要求返回的格式为json格式` `"""` `prompt = PromptTemplate.from_template(template=template, )` `data_chain = (` `RunnablePassthrough.assign(context=lambda x: get_by_filename("ip.har"), )` `| prompt` `| llm` `| JsonOutputParser()` `)` `return data_chain`` `` ``def get_case():` `"""` `通过大模型生成测试数据。` `:return:` `"""` `template = """` `你是一个自动化测试工程师,精通的技术栈为 Python pytest requests库` `以下是这个接口的具体信息,你的`` ` `{context}`` ` `请求的参数信息将输入一个字典,输入的内容为` `{req}`` ` `Question: {input}"""` `# 模板提示,输出 json 格式的回答` `prompt = PromptTemplate.from_template(` `template=template, )` `chain = (` `RunnablePassthrough.` `assign(context=lambda x: get_by_filename("获取ip测试用例.md"),` `req=get_case_data)` `| prompt` `| llm` `| StrOutputParser()` `)`` ` `input_template = """` `根据每条测试用例的测试步骤,生成对应的测试数据信息,` `每条测试用例要求都有一条对应的单独的pytest函数` `"""` `print(chain.invoke({"input": input_template}))`` `` ``if __name__ == '__main__':` `get_case()
总结
-
掌握接口自动化测试用例生成的原理。
-
了解如何通过大语言模型生成接口自动化测试脚本与数据。
-
掌握通过LangChain生成完整版接口自动化测试用例的方法。
如何学习大模型 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 的正确特征了。