目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
如果接口测试仅仅只是掌握一些requests或者其他一些功能强大的库的用法,是远远不够的,还需要具有根据公司的业务以及需求去定制化一个接口自动化测试框架能力。
Python接口自动化测试:https://www.bilibili.com/video/BV16G411x76E/
接口测试用例分析
通过与产品经理、项目经理、研发总监等对接后得知待测业务范围、业务场景用例、业务接口分析,从而确定公司的测试计划。将测试计划与质量需求结合进行分析,就可以开始进行业务用例的设计,而接口测试用例分析,也在其内。
接口测试封装思想
接口封装思想主要分为3个大维度,配置、接口封装、业务流程。
其中配置主要用作根据配置文件获取初始配置和依赖;
接口封装遵循apiobject设计模式,对接口的调用进行抽象封装;
业务流程则负责数据初始化、业务用例设计,包含有多个api形成的流程定义,不要再包含任何接口实现细节、以及断言。
加密接口的测试用例设计
由于信息安全的原因,许多的接口在传输的时候会对请求与响应进行加密处理,如果直接对这部分数据做断言显然是行不通的。还需要对这部分接口额外进行解密的处理之后,才可以对已解密的接口进行断言。
环境准备
在进行实战之前,需要先准备一个对响应加密的接口。对它发起一个get请求后,得到一个加密过后的响应信息。
先准备一个json格式demo
{"topics":
{
"orange":"movie",
"shool":"testing-studio",
"president":"seveniruby"
}
}
使用base64对其做加密,得到一个加密后的文件demo64.txt
base64 demo.json >demo64.txt
使用python命令在“demo64.txt”所在目录启动一个服务
python -m http.server 10000
启动后的样子如图:
使用curl命令对这个服务进行get请求
curl http://127.0.0.1:10000/demo64.txt
如果请求成功的话就代表环境已经准备成功
实战
调用base64,直接对返回的请求做解密,即可得到解密后的响应,将解密后的响应转为json格式,此时就可以对这个返回值做断言且不会报错了
import base64
import json
import requests
class TestEncode:
url = "http://127.0.0.1:10000/demo64.txt"
def test_encode(self):
r = requests.get(self.url)
encode = json.loads(base64.b64decode(r.content))
assert encode["topics"]["president"] == "seveniruby"
这样的写法显然不够优雅,如果被测接口的协议发生变化,requests库无法支持改变后的协议,需要调用别的第三库发送请求信息,则还是需要修改底层的源码。碰到这种情况,可以增加一层封装,构造一层更加通用的发送方法。
首先需要通过一个字典的结构体,保存所有的请求信息,包括发送的协议、解码方式、请求method等等,而这种字典形式的结构体也为后面的数据驱动改造做好了一个重要的铺垫。
req_data={
"schema": "http",
"method": "get",
"url": "http://127.0.0.1:10000/demo64.txt",
"headers": None
}
通过请求信息的结构体中的schema,添加判断条件,去选择不同的请求协议。举个例子,如果schema为“http”的话,就选择调用被封装的requests库。
class ApiRequest:
#构造send方法,通过
def send(self, data: dict):
if "http" == data["schema"] :
res = requests.request(
data["method"],data["url"],header=data["headers"])
return json.loads(base64.decode(res.content))
elif "dubbo" == data["schema"]:
pass
elif "websocket" == data["schema"]:
pass
else:
pass
调用在ApiRequest类中的send方法发送请求并进行断言
class TestEncode:
def test_api(self):
req_data={
"schema": "http",
"encoding": "base64",
"method": "get",
"url": "http://127.0.0.1:10000/demo64.txt",
"headers": None
}
re = ApiRequest()
data = re.send(req_data)
assert data["topics"]["president"] == "seveniruby"
如果面对不同的算法,还需要修改底层的源码,所以需要把算法封装。需要使用哪个算法,就使用哪个。封装的思想与上面相同。首先在字典结构体中添加一个encoding字段,用来判断选择的不同的加密条件
req_data={
"schema": "http",
"method": "get",
"url": "http://127.0.0.1:10000/demo64.txt",
"headers": None,
"encoding": "base64"
}
还是通过请求信息的结构体中的encoding,添加判断条件,去选择不同的解密方式。
class ApiRequest:
def send(self, data: dict):
if "http" == data["schema"] :
res = requests.request(
data["method"],data["url"],headers=data["headers"])
return json.loads(base64.b64decode(res.content))
#通过请求信息的结构体中的`encoding`,去选择不同的解密方式。
if data["encoding"] == "base64":
return json.loads(base64.b64decode(res.content))
elif data["encoding"] == "private":
return json.loads(
requests.post("url", data=res.content).content)
else:
return json.loads(res.content)
首先需要明确在面对一个加密的响应结果,可以使用什么样的处理方式:
1.如果知道使用的是哪个通用加密算法的话,可以自行解决。
2.如果不了解对应的加密算法的话,可以让研发提供加解密的lib。
3.如果既不是通用加密算法、研发也无法提供加解密的lib的话,可以让加密方提供远程解析服务,这样算法仍然是保密的。
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
不要被眼前的困难所迷惑,也不要被过去的失败所打击,勇往直前,永不放弃,相信自己的能力,坚持梦想的路途,最终必定收获成功的喜悦!
成功需要勇气、毅力和耐心,但更重要的是不断前行的决心。哪怕道路再远,也请坚定地走下去,因为只有奋斗才能让你成为更好的自己!
追逐梦想的道路上,永远不要放弃自己。即使前路漫漫,也请坚定信念,勇往直前。因为只有拼尽全力,才能成就辉煌人生!