目录:导读
前言
1、API测试怎么做?
如何应对复杂场景的 API 测试?
测试场景一:被测业务操作是由多个 API 调用协作完成
背景:一个单一的前端操作可能会触发后端一系列的 API 调用,此时 API 的测试用例就不再是简单的单个 API 调用,而是一系列 API 的调用。
存在情况:
1)存在后一个 API 需要使用前一个 API 返回结果的情况。
2)需要根据前一个 API 的返回结果决定后面应该调用哪个 API。
存在问题:
高效地获取单个前端操作所触发的 API 调用顺序
解决思路:
1)通过抓包,获取前端操作时所触发的 API 调用顺序。
2)通过用户行为日志,通过大数据手段来获取调用顺序。
测试场景二:API 测试过程中的第三方依赖
背景:API 之间存在依赖关系的,比如你的被测对象是 API A,但是 API A 的内部调用了 API B,此时如果由于某种原因,API B 在被测环境中处于不可用状态,那么 API A 的测试就会受到影响。
解决思路:
启动 Mock Server 来代替真实的 API
测试场景三:异步 API 的测试
什么是异步 API?
调用后会立即返回,但是实际任务并没有真正完成,而是需要稍候去查询或者回调的 API
对异步 API 的测试主要分为两个部分:
1)测试异常调用是否成功:检查返回值和后台工作线程是否被创建两个方面。
2)测试异步调用的业务逻辑处理是否正确。
测试异步调用的业务逻辑复杂性:
因为异步 API 通常发生在一些比较慢的操作上,比如数据 I/O、消息队列 I/O 等,此时测试往往需要去验证数据库中的值、消息队列中的值等,这就需要测试代码具有访问和操作数据库或者消息队列的能力。
在实际工程项目中,这些能力一般会在测试框架级别提供,也就是说 API 测试框架中包含对应的工具类去访问数据库或者消息队列。
2、mock 测试技术
mock 简介:
mock 技术主要分为两类:
mock服务:实现 mock 功能的一个服务
mock数据:mock 一个对象,写入一些预期值
mock 模块是 Python 的测试框架 unittest 下的一个子库,可以模拟一个方法、一个对象或者一个类,然后使用模拟的对象替换系统的一部分,对系统的一个单元进行测试,并对它们已使用的方式进行断言。
场景:比如有 A 和 B 两个模块,A 模块中有调用到 B 模块的方法,但是现在 B 模块中被 A 模块调用的方法需要修改,而我们又不想让它影响 A 模块的功能测试,所以就用到了单元测试模块 unittest 中的 mock 模块,mock 模块就是模拟出一个假的 B 模块供 A 模块测试用。
3、JSON 处理技巧
JSON:一种轻量级的数据交换格式,一般接口返回的数据类型都是JSON。
JSON的定义格式与字典相同,也是键值对方式,如{key:value}。其实 JSON 是字符串,由于字符串不能用 key、value 来取值,所以要先转换为字典才可以。
JSON 模块常用的四个方法:
1)json.dumps():将 Python 任意对象转换成 string 对象
def json_dumps_demo():
test_list = [1, 2, 3]
print(type(json.dumps(test_list))) # 打印结果为:str
test_dict = {"name": "test", "age": 10}
print(type(json.dumps(test_dict))) # 打印结果为:str
test_int = 99
print(type(json.dumps(test_int))) # 打印结果为:str
2)json.loads():将 string 对象转换成 python 对象
def json_loads_demo():
string_list = "[1, 2, 3]"
print(type(json.loads(string_list))) # 打印结果为:list
string_dict = '{"name": "test", "age": 10}'
print(type(json.loads(string_dict))) # 打印结果为:dict
string_int = "99"
print(type(json.loads(string_int))) # 打印结果为:int
3)json.dump():序列化,将Python对象序列化成JSON格式并写入文件
def json_dump_demo():
test_dict = {"name": "test", "age": 10}
with open("json_test.json", "w") as fp:
json.dump(test_dict, fp, indent="\t", ensure_ascii=False)
4)json.load():反序列化,从JSON文件中读取数据并将其反序列化为Python对象
def json_load_demo():
with open("json_test.json", "r") as fp:
data = json.load(fp)
print(type(data)) # 打印结果为:dict
总结:
序列化和反序列化:数据转换的两个互逆过程,用于在不同呢环境中传递和存储数据
序列化:将对象的状态信息转换为可存储或传输的格式,例如字节流、JSON字符串或XML文档;目的:将复杂的数据结构转换成已存储、传输和共享的格式
反序列化:将序列化后的数据转换回原始的对象或数据结构;目的:重建对象的状态,以便程序能够使用它
类比:
序列化(dump):将乐高模型(高级数据类型)拆解成各个零件(字符串)
反序列化(load):将各个零件(字符串)组装成乐高模型(高级数据类型)
json.dump()、json.dumps():序列化,将Python对象转换成JSON字符串
json.load()、json.loads():反序列化,将JSON字符串转换成Python对象
*
带 s 的都是和字符串相关,不带 s 的和文件相关
最全Python自动化测试进阶之路视频教学 (全集)
下面是我整理的2025年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
人生最动人的风景,往往藏在最难攀爬的高处。当你觉得力竭时,请记住:每一次坚持都在雕刻更强大的自己。别问路有多远,只管迈步向前;别怕山有多高,向上攀登就是答案!
你体内沉睡着改变世界的力量!每个清晨都是改写命运的新机会,每次挫折都是精心包装的礼物。当全世界都在说"不可能"时,正是你证明"可能"的最好时机!