python实现接口自动化

devtools/2025/3/17 6:12:19/
  • 代码实现自动化相关理论
  • 代码编写脚本和工具实现脚本区别是啥?
  • 代码:
    • 优点:代码灵活方便
    • 缺点:学习成本高
  • 工具:
    • 优点:易上手
    • 缺点:灵活度低,有局限性。
  • 总结:
    • 功能脚本:工具
    • 自动化脚本:代码

第一步:python+request+unittest;
具体描述?
第二步:封装、调用、数据驱动、日志、报告;
详细举例:
第三步:api\scripts\data\log\report\until…

  • 脚本实现
  • 使用代码编写自动化脚本的流程

1、抽取功能用例转为自动化用例
2、搭建环境(测试工具、)
3、搭建目录结构
4、编写脚本
5、执行脚本
6、配置持续集成

  • 抽取功能转为自动化用例
    在这里插入图片描述

  • 搭建环境(测试工具)

1、python、Pycharm、requests、pymysql、parametrize
2、jenkins、jdk
提示:由于编写的自动化脚本,而自动化脚本编写之前功能已测试完毕,所以不需要在单独搭建项目环境。

  • 搭建目录结构
    在这里插入图片描述
  • 代码编写
  • config.py
import os
# 服务器地址
HPST = "http://user-p2p-test.itheima.net"# 项目目录路径
dir_path = os.path.dirname(__file__)
  • api(api_register_login.py)
from config import HOST
class ApiRegisterLogin:# 初始化def __init__(self, session):# 获取session对象self.session = session  # 实例化session,类下面的其他接口就能使用自己的session# 图片验证码urlself.__url_img_code = HOST + "/common/public/verifycode1/{}"   # {}是随机变量,用{}占用# 短信验证码urlself.__url_phone_code = HOST + "/member/public/sendSms"# 注册urlself.__url_register = HOST + "/member/public/reg"# 登录urlself.__url_login = HOST + "/member/public/login"# 登录状态urlself.__url_login_status = HOST + "/member/public/islogin"# 获取图片验证码接口 封装def api_img_code(self):pass# 获取短信验证码接口 封装def api_phone_code(self):pass# 注册接口 封装def api_register(self):pass# 登录接口 封装def api_login(self):pass# 查询登录状态接口 封装def api_login_status(self):pass

加上__,只能在当千模块里调用,其他py文件调用不了
在这里插入图片描述

  • 接口封装 实现
 # 获取图片验证码接口 封装def api_img_code(self, random):# 调用get方法,返回响应对象res = self.session.get(url=self.__url_img_code.format(random))return res# 获取短信验证码接口 封装def api_phone_code(self, phone, imgVerifyCode):# 1、定义请求参数data = {"phone": phone,"imgVerifyCode": imgVerifyCode,"type": "reg"}# 2、调用请求方法res = self.session.post(url=self.__url_phone_code, data=data)return res# 注册接口 封装def api_register(self, phone, password, verifycode, phone_code):# 1、定义请求参数data = {"phone": phone,"password": password,"verifycode": verifycode,"phone_code": phone_code,"dy_server": "on","invite_phone": ""}# 2、调用请求方法res = self.session.post(url=self.__url_register, data=data)return res# 登录接口 封装def api_login(self, keywords, password):# 1、定义请求参数data = {"keywords": keywords,"password": password}# 2、调用请求方法res = self.session.post(url=self.__url_login, data=data)return res# 查询登录状态接口 封装def api_login_status(self):res = self.session.post(self.__url_login_status)
  • script(test01_register_login.py)
    在这里插入图片描述
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试def test01_img_code(self):pass# 获取短信验证码接口 测试def test02_phone_code(self):pass# 注册接口测试def test03_register(self):pass# 登录接口 测试def test04_login(self):pass# 查询登录状态 测试def test05_login_status(self):pass
  • 注册登录接口调试测试
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试def test01_img_code(self):# 1、调用图片验证码接口r = self.reg.api_img_code(123)# 2、查看响应状态码print(r.status_code)# 获取短信验证码接口 测试def test02_phone_code(self, phone=13600001111, imgVerifyCode=8888):# 1、调用获取图片验证码接口----目的:让session记住cookieself.reg.api_img_code(123)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、查看响应结果print(r.json())# 注册接口测试def test03_register(self, phone=13600001111, imgVerifyCode=8888, password="test123", phone_code=666666):# 1、图片验证码接口self.reg.api_img_code(123)# 2、短信验证码接口self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、注册接口r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)# 4、查看结果print(r.json())# 登录接口 测试def test04_login(self, keywords=13600001111, password="test123"):# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果print(r.json())# 查询登录状态 测试def test05_login_status(self, keywords=13600001111, password="test123"):# 1、调用登录接口self.reg.api_login(keywords=keywords, password=password)# 2、调用查询登录结果接口r = self.reg.api_login_status()print(r.json())
  • 断言

说明:判断程序执行实际结果是否符合预期结果

  • 示例:

在这里插入图片描述

  • 提示:
    • 捕获异常的目的是为了将错误信息记录下来
    • 捕获信息完成后,必须抛出异常
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试def test01_img_code(self):try:# 1、调用图片验证码接口r = self.reg.api_img_code(123)# 2、查看响应状态码self.assertEqual(200, r.status_code)except Exception as e:# 日志print(e)# 抛出异常raise# 获取短信验证码接口 测试def test02_phone_code(self, phone=13600001111, imgVerifyCode=8888, expect_text="发送成功"):try:# 1、调用获取图片验证码接口----目的:让session记住cookieself.reg.api_img_code(123)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、查看响应结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 注册接口测试def test03_register(self, phone=13600001111, imgVerifyCode=8888, password="test123", phone_code=666666, expect_text="注册成功"):try:# 1、图片验证码接口self.reg.api_img_code(123)# 2、短信验证码接口self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、注册接口r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)# 4、查看结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 登录接口 测试def test04_login(self, keywords=13600001111, password="test123", expect_text="登录成功"):try:# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛异常raise# 查询登录状态 测试def test05_login_status(self, keywords=13600001111, password="test123", expect_text="OK"):try:# 1、调用登录接口self.reg.api_login(keywords=keywords, password=password)# 2、调用查询登录结果接口r = self.reg.api_login_status()self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise
  • 参数化

  • 步骤

1.编写数据存储文件json
2.编写读取工具方法 read_json()
3.使用参数化组件进行引用 parametrize

  • 1 .编写参数化文件(register_login.json)

心得:
1、根据模块来新建json文件1个模块1个json文件
2、最外侧使用{}模块下几个接口,编写几个key值为列表
3、列表值中,有几组数据,就写几个{}
4、每组数据{}中,组成格式:说明+参数+预期结果

  • 几个接口几个key,这里有五个接口(图片验证码、短信验证码、注册、登录、登录状态接口)
  • 每组数据组成格式:说明+参数+预期结果
{"img_code": [{"desc": "获取图片验证码成功(随机小数)","random": "0.123","expect_code": 200},{"desc": "获取图片验证码成功(随机整数)","random": "123","expect_code": 200},{"desc": "获取图片验证码成功(随机数为空)","random": "","expect_code": 404},{"desc": "获取图片验证码成功(随机数为字符串)","random": "heloo123","expect_code": 400}],"phone_code": [{"desc": "获取短信验证码成功","phone": "13600001111","imgVerifyCode": "8888","expect_text": "发送成功"},{"desc": "获取短信验证码失败","phone": "13600001111","imgVerifyCode": "8889","expect_text": "验证码错误"}],"register": [{"desc": "注册成功(必填参数)","phone": "13600001111","password": "test123","verifycode": 8888,"phone_code": 666666,"dy_server": "on","expect_text": "注册成功"},{"desc": "注册失败(图片验证码错误)","phone": "13600001112","password": "test123","verifycode": 8889,"phone_code": 666666,"dy_server": "on","expect_text": "验证码错误"},{"desc": "注册失败(短信验证码错误)","phone": "13600001112","password": "test123","verifycode": 8888,"phone_code": 666667,"dy_server": "on","expect_text": "验证码错误"},{"desc": "注册失败(手机号已存在)","phone": "13600001111","password": "test123","verifycode": 8888,"phone_code": 666666,"dy_server": "on","expect_text": "已存在"}],"login": [{"desc": "登录成功","keywords": "13600001111","password": "test123","expect_text": "登录成功"}, {"desc": "登录失败(密码为空)","keywords": "13600001111","password": "","expect_text": "不能为空"}, {"desc": "登录失败(解锁)","keywords": "13600001111","password": "errror123","expect_text": "登录成功"}],"login_status": [{"desc": "查询登录状态(已登录)","status": "已登录","expect_text": "OK"}, {"desc": "查询登录状态(未登录)","status": "未登录","expect_text": "未登"}]
}
  • 2、编写读取数据工具(util.py)在这里插入图片描述
    在这里插入图片描述
from config import DIR_PATHdef read_json(filename, key):# 拼接读取文件的完整路径  os.sep动态获取/ 还是 \ ,根据电脑的操作系统file_path = DIR_PATH + os.sep + "data" + os.sep + filenamearr = []with open(file_path, 'r', encoding="utf-8") as f:# print(json.load(f))# print(json.load(f).get(key)) [{},{},{}]----->[(),(),()]for data in json.load(f).get(key):arr.append(tuple(data.values())[1:])print(arr)if __name__ == '__main__':read_json("register_login.json", "img_code")# [('0.123', 200), ('123', 200), ('', 404), ('heloo123', 400)]
  • 参数化引用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 难点1:错误次数锁定
    在这里插入图片描述
    在这里插入图片描述
 # 登录接口 测试@parameterized.expand(read_json("register_login.json", "login"))def test04_login(self, keywords, password, expect_text):try:i = 1if "error" in password:while i <= 3:r = self.reg.api_login(keywords=keywords, password=password)i += 1# 断言锁定print("测试锁定:", r.text)self.assertIn("锁定", r.text)# 暂停60ssleep(60)# 测试登录成功r = self.reg.api_login(keywords="13600001111", password="test123")self.assertIn(expect_text, r.text)# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛异常raise
  • 查询登录状态,不同结果。
    在这里插入图片描述
    在这里插入图片描述
# 查询登录状态 测试@parameterized.expand(read_json("register_login.json", "login_status"))def test05_login_status(self, status, expect_text):try:if status == "已登录":# 1、调用登录接口self.reg.api_login(keywords="13600001111", password="test123")# 2、调用查询登录结果接口r = self.reg.api_login_status()self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise
  • 断言代码示例:(test01_register_login.py)
import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginfrom parameterized import parameterizedfrom util import read_jsonfrom time import sleepclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self):# 获取session对象self.session = requests.session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self):# 关闭session对象self.session.close()# 获取图片验证码接口 测试@parameterized.expand(read_json("register_login.json", "img_code"))def test01_img_code(self, random, expect_code):try:# 1、调用图片验证码接口r = self.reg.api_img_code(random)# 2、查看响应状态码self.assertEqual(expect_code, r.status_code)except Exception as e:# 日志print(e)# 抛出异常raise# 获取短信验证码接口 测试@parameterized.expand(read_json("register_login.json", "phone_code"))def test02_phone_code(self, phone, imgVerifyCode, expect_text):try:# 1、调用获取图片验证码接口----目的:让session记住cookieself.reg.api_img_code(123)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、查看响应结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 注册接口测试@parameterized.expand(read_json("register_login.json", "register"))def test03_register(self, phone, password, imgVerifyCode, phone_code, expect_text):try:# 1、图片验证码接口self.reg.api_img_code(123)# 2、短信验证码接口self.reg.api_phone_code(phone=phone, imgVerifyCode=imgVerifyCode)# 3、注册接口r = self.reg.api_register(phone=phone, password=password, verifycode=imgVerifyCode, phone_code=phone_code)# 4、查看结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise# 登录接口 测试@parameterized.expand(read_json("register_login.json", "login"))def test04_login(self, keywords, password, expect_text):try:i = 1if "error" in password:while i <= 3:r = self.reg.api_login(keywords=keywords, password=password)i += 1# 断言锁定print("测试锁定:", r.text)self.assertIn("锁定", r.text)# 暂停60ssleep(60)# 测试登录成功r = self.reg.api_login(keywords="13600001111", password="test123")self.assertIn(expect_text, r.text)# 1、登录接口r = self.reg.api_login(keywords=keywords, password=password)# 2、查询结果self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛异常raise# 查询登录状态 测试@parameterized.expand(read_json("register_login.json", "login_status"))def test05_login_status(self, status, expect_text):try:if status == "已登录":# 1、调用登录接口self.reg.api_login(keywords="13600001111", password="test123")# 2、调用查询登录结果接口r = self.reg.api_login_status()self.assertIn(expect_text, r.text)except Exception as e:# 日志print(e)# 抛出异常raise

http://www.ppmy.cn/devtools/167747.html

相关文章

【后端】【django】Django 自带的用户系统与 RBAC 机制

Django 自带的用户系统与 RBAC 机制 Django 自带的用户系统&#xff08;django.contrib.auth&#xff09;提供了 身份验证&#xff08;Authentication&#xff09; 和 权限管理&#xff08;Authorization&#xff09;&#xff0c;能够快速实现 用户管理、权限控制、管理员后台…

机器学习周报--文献阅读

文章目录 摘要Abstract 1 文章内容1.1 模型结构1.1.1 LSTMAT的结构设置1.1.2 AWPSO算法优化模型 1.2 实验与结果讨论1.2.1 处理缺失数据1.2.2 模型评估指标1.2.3 比较实验1.2.4 消融实验&#xff08;ABLATION EXPERIMENTS&#xff09; 2相关知识2.1 自适应权重粒子群优化&#…

C++(14)—类和对象(中) ④赋值运算符重载

文章目录 一、运算符重载的基本概念1.1 什么是运算符重载&#xff1f;1.2 运算符重载的限制 二、运算符重载的实现方式2.1 成员函数重载2.2 全局函数重载 三、赋值运算符重载3.1 赋值运算符重载的作用3.2 赋值运算符重载的特点 四、深拷贝与浅拷贝4.1 浅拷贝的问题4.2 深拷贝的…

群体智能优化算法-金豺优化算法(Golden Jackal Optimization, GJO,含Matlab源代码)

摘要 金豺优化算法&#xff08;Golden Jackal Optimization, GJO&#xff09;是一种基于金豺&#xff08;Golden Jackal&#xff09;的群体捕猎行为而提出的新型元启发式算法。该算法通过模拟雄豺与雌豺在狩猎时的协同合作与分工机制&#xff0c;结合莱维&#xff08;Lvy&…

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

【C语言系列】C语言内存函数

C语言内存函数 一、memcpy使用和模拟实现1.1memcpy函数1.2memcpy函数的模拟实现 二、memmove使用和模拟实现2.1memmove函数2.2memmove函数的模拟实现 三、memset函数的使用3.2memset函数及使用 四、memcmp函数的使用4.1memcmp函数及使用 五、总结memcpy 函数memmove 函数memset…

数据结构与算法-图论-欧拉路径和欧拉回路(有向图和无向图,骑马修栅栏,单词游戏 play on words)详细代码注解

基础前置知识&#xff1a; 有向图&#xff1a; 欧拉路径&#xff1a; 定义&#xff1a;在有向图中&#xff0c;从一个顶点出发&#xff0c;经过每条边恰好一次&#xff0c;并且遍历所有顶点的路径称为有向图的欧拉路径。 特征&#xff1a;有向图存在欧拉路径&#xff0c;当…

【开原宝藏】30天学会CSS - DAY1 第一课

下面提供一个由浅入深、按步骤拆解的示例教程&#xff0c;让你能从零开始&#xff0c;逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了&#xff0c;以下示例仅创建四个图标&#xff08;Facebook、Twitter、Google、LinkedIn&#xff09;&#xff0c;并在每一步…