金融项目实战 05|Python实现接口自动化——登录接口

目录

一、代码实现自动化理论及流程

二、脚本实现的理论和准备工作

1、抽取功能转为自动化用例

2、搭建环境(测试工具)

3、搭建目录结构

三、登录接口脚本实现 

1、代码编写

1️⃣api目录

2️⃣script目录

2、断言

3、参数化

1️⃣编写数据存储文件:json文件

2️⃣编写读取数据工具:read_json()

3️⃣参数化引用:parameterize


一、代码实现自动化理论及流程

🔴代码编写脚本和工具实现脚本区别是什么?

  • 代码:
    • 优点:代码灵活方便
    • 缺点:学习成本高
  • 工具:
    • 优点:易上手
    • 缺点:灵活度低,有局限性。
  • 总结:
    • 功能脚本:工具
    • 自动化脚本:代码

🔴代码接口自动化怎么做的?

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

二、脚本实现的理论和准备工作

使用代码编写自动化脚本的流程:

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

1、抽取功能转为自动化用例

 去掉了有bug的用例、以及“请求后台投资响应失败(密码为空)”的用例(改用例需要借钱和投资双方私下协商密码)

2、搭建环境(测试工具)

①python、pycharm、requests、pymysql、parametrize

②jenkins、jdk

提示:由于编写的自动化脚本,而自动化脚本编写之前功能已测试完毕,所以不需要在单独搭建项目环境。

3、搭建目录结构

三、登录接口脚本实现 

1、代码编写

1️⃣api目录

把需要测的接口放在该目录

用到五个url,所以是5个接口,也需要在注册登录模块写五个方法

url设置成私有变量,只能在该类内部调用。

此处这样做只是因为url实际上只会在该登陆注册模块内部使用,外面没必须用到,设置私有,外部调用方法的时候。看着干净

from config import HOSTclass ApiRegisterLogin:# 有几个接口就封装几个方法#初始化def __init__(self, session):# 获取session对象self.session = session# 图片url# 图片验证码urlself.__url_img_code = HOST + "/common/public/verifycode1/{}"# 短信验证码urlself.__url_phone_code = HOST + "/member/public/sendSms"# 注册Lr1self.__url_register = HOST + "/member/public/reg"# 登录urlself.__url_login = HOST + "/member/public/login"# 登录状态urlself.__url_login_status = HOST + "/member/public/islogin"# url# 1、获取图⽚验证码接⼝ 封装def api_img_code(self,random):return self.session.get(url=self.__url_img_code.format(random))# 2、获取短信验证码接⼝ 封装def api_phone_code(self,phone,imgVerifyCode):data = {"phone": phone,"imgVerifyCode": imgVerifyCode,"type": "reg"}return self.session.post(url=self.__url_phone_code,data=data)# 3、注册接⼝ 封装def api_register(self,phone,password,verifycode,phone_code):data = {"phone": phone,"password": password,"verifycode": verifycode,"phone_code": phone_code,"dy_server": "on","invite_phone": ""}return self.session.post(url=self.__url_register,data=data)# 4、登录接⼝ 封装def api_login(self,keywords,password):data = {"keywords": keywords,"password": password}return self.session.post(url=self.__url_login, data=data)# 5、查询登录状态接⼝ 封装def api_login_status(self):return self.session.post(url=self.__url_login_status)
2️⃣script目录

调用封装的接口,开展测试工作

下面测试用例的内容目前只是测试一下api文件中封装的接口能不能用,后面还要改。

import unittestimport requestsfrom api.api_register_login import ApiRegisterLoginclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self) -> None:# 获取session对象self.session =requests.Session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self) -> None:# 关闭session对象self.session.close()#1、获取图片验证码接口 测试def test01_img_code(self):# 调用图片验证码接口r = self.reg.api_img_code(234)# 查看响应状态码print(r.status_code)#2、获取短信验证码接口 测试def test02_phone_code(self,phone=17612341111,imgVerifyCode=8888):# 1、调用获取图片验证码接口 -- 目的:让session对象记录cookie# 调用接口后session会自动记录cookieself.reg.api_img_code(234)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone,imgVerifyCode=imgVerifyCode)# 3、查看响应结果print(r.json())#3、注册接口 测试def test03_register(self,phone=17612341111,imgVerifyCode=8888,password="win56",phone_code=666666):# 1、图片验证码接口self.reg.api_img_code(234)# 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())#4、登录接口 测试def test04_login(self,keywords=17612341111,password="win56"):# 1、调用登录r = self.reg.api_login(keywords=keywords,password=password)# 2、查看结果print(r.json())#5、查询登录状态接口 测试def test05_login_status(self):# 调用登录擦口self.reg.api_login(keywords=17612341111, password="win56")# 调用查询登录状态接口r = self.reg.api_login_status()# 看结果print(r.json())

2、断言

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

示例

实际需要将api_register_login.py中的每个测试用例都做异常处理,下面只是以查询登录接口中的异常捕获为例。

中的完整代码后续补充。

try:# 调⽤登录接⼝self.reg.api_login(keywords="13600001111", password="test123")# 调⽤查询登录状态接⼝r = self.reg.api_login_status()# 看结果self.assertIn(expect_text, r.text)
except Exception as e:# ⽇志print(e)# 抛异常raise    # 提示:捕获异常的⽬的是为了将错误信息记录下来,捕获信息完成后,必须抛出异常

【提示】:捕获异常的目的是为了将错误信息记录下来,捕获信息完成后,必须抛出异常 

3、参数化

步骤

  • 1、编写数据存储⽂件 json
  • 2、编写读取⼯具⽅法 read_json()
  • 3、使⽤参数化组件进⾏引⽤ parametrize
1️⃣编写数据存储文件:json文件

心得:

1、根据模块来新建json文件(1个模块1个json⽂件)

2、最外侧使用{},模块下几个接口,编写几个key,值为列表

3、列表值中,有几组数据,就写几个{}

4、每组数据{}中,组成格式:说明+参数+预期结果

 

{"img_code": [{"desc": "获取图片验证码成功(随机小数)","random": 0.123,"expect_code": 200},{"desc": "获取图片验证码成功(随机整数)","random": 123,"expect_code": 200},{"desc": "获取图片验证码失败(随机数为空)","random": "","expect_code": 404},{"desc": "获取图片验证码失败(随机数为字符串)","random": "123hello","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,"expect_text": "注册成功"},{"desc": "注册失败(图片验证码错误)","phone": 13600001112,"password": "test123","verifycode": 8889,"phone_code": 666666,"expect_text": "验证码错误"},{"desc": "注册失败(短信验证码错误)","phone": 13600001112,"password": "test123","verifycode": 8888,"phone_code": 666667,"expect_text": "验证码错误"},{"desc": "注册失败(手机号已存在)","phone": 13600001111,"password": "test123","verifycode": 8888,"phone_code": 666666,"expect_text": "已存在"}],"login": [{"desc": "登录成功","keywords": 13600001111,"password": "test123","expect_text": "登录成功"},{"desc": "登录失败(密码为空)","keywords": 13600001111,"password": "","expect_text": "不能为空"},{"desc": "登录失败(解锁)","keywords": 13600001111,"password": "error123","expect_text": "登录成功"}],"login_status": [{"desc": "查询登录状态(已登录)","status": "已登录","expect_text": "OK"},{"desc": "查询登录状态(已登录)","status": "未登录","expect_text": "未登"}]
}
2️⃣编写读取数据工具:read_json()

 

import json
import osfrom config import DIR_PATHdef read_json(filename,key):# 拼接读取文件的完整路径# os.sep是动态获取/ \filepath = DIR_PATH + os.sep + "data" + os.sep +filenamearr = []with open(filepath,"r",encoding="utf-8") as f:for data in json.load(f).get(key):arr.append(list(data.values())[1:])return arrif __name__ == '__main__':# 测试一下能不能读取到数据print(read_json("register_login.json","img_code")) # 读取的数据为:[[0.123, 200], [123, 200], ['', 404], ['123hello', 400]]
3️⃣参数化引用:parameterize

难点1:错误次数锁定

难点2: 查询登录状态,不同结果。

 【注意】由于parameterized的自身bug,运行测试用例必须是点击到测试用例所在的类名右键运行。如果想单独运行某个接口用例,则把其他接口代码先注释掉。

import unittest
from time import sleepimport requestsfrom api.api_register_login import ApiRegisterLoginfrom parameterized import parameterizedfrom util import read_jsonclass TestRegisterLogin(unittest.TestCase):# 初始化def setUp(self) -> None:# 获取session对象self.session =requests.Session()# 获取ApiRegisterLogin实例self.reg = ApiRegisterLogin(self.session)# 结束def tearDown(self) -> None:# 关闭session对象self.session.close()#1、获取图片验证码接口 测试@parameterized.expand(read_json("register_login.json","img_code"))def test01_img_code(self,random,expect_code):try:# 调用图片验证码接口r = self.reg.api_img_code(random)# 查看响应状态码# print(r.status_code)self.assertEqual(expect_code,r.status_code)except Exception as err:# 日志print(err)# 抛异常raise#2、获取短信验证码接口 测试@parameterized.expand(read_json("register_login.json", "phone_code"))def test02_phone_code(self,phone,imgVerifyCode,expec_text):try:# 1、调用获取图片验证码接口 -- 目的:让session对象记录cookie# 调用接口后session会自动记录cookieself.reg.api_img_code(234)# 2、调用短信验证码接口r = self.reg.api_phone_code(phone=phone,imgVerifyCode=imgVerifyCode)# 3、查看响应结果# print(r.json())self.assertIn(expec_text,r.text) # 使用text提取结果是更方便,json还要根据键找值except Exception as err:# 日志print(err)# 抛异常raise#3、注册接口 测试@parameterized.expand(read_json("register_login.json", "register"))def test03_register(self,phone,password,imgVerifyCode,phone_code,expec_text):try:# 1、图片验证码接口self.reg.api_img_code(234)# 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())self.assertIn(expec_text,r.text)except Exception as err:# 日志print(err)# 抛异常raise#4、登录接口 测试@parameterized.expand(read_json("register_login.json", "login"))def test04_login(self,keywords,password,expec_text):try:i = 0r = Noneif "error" in password:while i <3:r=self.reg.api_login(keywords,password)i+=1# 锁定断言print("账号密码输错3次,账号锁定:",r.text)self.assertIn("锁定",r.text)# 暂停60秒sleep(60)r = self.reg.api_login(keywords=17612341111, password="win56")self.assertIn(expec_text,r.text)else:# 1、调用登录r = self.reg.api_login(keywords,password)# 2、查看结果# print(r.json())self.assertIn(expec_text, r.text)except Exception as err:# 日志print(err)# 抛异常raise#5、查询登录状态接口 测试@parameterized.expand(read_json("register_login.json", "login_status"))def test05_login_status(self,status,expec_text):try:if status == "已登录":# 调用登录擦口self.reg.api_login(keywords=17612341111, password="win56")# 调用查询登录状态接口r = self.reg.api_login_status()# 看结果# print(r.json())self.assertIn(expec_text, r.text)except Exception as err:# 日志print(err)# 抛异常raise

【总结】目前为止已经写的文件,文件内容上面均给出了代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2686.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# .NetCore 使用 Flurl.Http 与 HttpClient 请求处理流式响应

AI对话接口采用流式返回&#xff1a; 1、使用Flurl处理返回的数据流 using Flurl; using Flurl.Http; [HttpPost] public async Task<string> GetLiushiChatLaw() { //1、请求参数&#xff0c;根据实际情况 YourModel request new YourModel();string allStr …

南京地铁路线和站点2021-2030含规划线路shp数据arcmap地铁图坐标wgs84无偏移内容分析测评

南京地铁路线与站点数据是地理信息系统&#xff08;GIS&#xff09;中常用的一种数据格式&#xff0c;主要用来表示城市轨道交通网络。在本压缩包中&#xff0c;包含的是2021年至2030年&#xff0c;包括规划线路的南京地铁信息&#xff0c;数据类型为Shapefile&#xff08;shp&…

Web3D交互展示:重塑产品展示的新维度

在当今数字化时代&#xff0c;如何高效、直观地展示产品成为企业营销的关键一环。传统的二维图片和视频展示虽然在一定程度上能够传达产品信息&#xff0c;但往往缺乏沉浸感和互动性&#xff0c;难以满足消费者日益增长的体验需求。在此背景下&#xff0c;Web3D交互展示应运而生…

JVM远程调试原理剖析

一、如何开启JVM远程调试 当一个 Java 应用启动时&#xff0c;JVM 会根据启动参数配置其运行环境。使用 -agentlib:jdwp 参数启动远程调试功能&#xff0c;JVM 会初始化调试代理。 agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your_application.jar…

人工智能之深度学习-[1]-了解深度学习

深度学习 深度学习&#xff08;Deep Learning&#xff09;是机器学习&#xff08;Machine Learning&#xff09;的一种方法&#xff0c;它通过模拟人脑的神经网络结构来进行学习和推理。深度学习使用多层神经网络来分析和建模数据&#xff0c;尤其擅长处理大量数据和复杂模式的…

【C语言】_字符串追加/连接函数strcat

目录 1. 函数声明与功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版&#xff1a;判空返回值对标strcatconst保证不可修改 4.2 第二版&#xff1a;优化\0的单独拼接 1. 函数声明与功能 char * strcat ( char * destination, const char * source ); strcat函数功能…

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理

【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章&#xff0c;若需要转载&#xff0c;请注明出处。 原文地址&#xff1a;https://blog.csdn.net/qq_30270773/article…

【机器学习】制造业转型:机器学习如何推动工业 4.0 的深度发展

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;工业4.0的浪潮席卷而来。工业4.0旨在通过将…

半导体数据分析: 玩转WM-811K Wafermap 数据集(三) AI 机器学习

前面我们已经通过两篇文章&#xff0c;一起熟悉了WM-811K Wafermap 数据集&#xff0c;并对其中的一些数据进行了调用&#xff0c;生成了一些统计信息和图片。今天我们接着继续往前走。 半导体数据分析&#xff1a; 玩转WM-811K Wafermap 数据集&#xff08;二&#xff09; AI…

ClickHouse-CPU、内存参数设置

常见配置 1. CPU资源 1、clickhouse服务端的配置在config.xml文件中 config.xml文件是服务端的配置&#xff0c;在config.xml文件中指向users.xml文件&#xff0c;相关的配置信息实际是在users.xml文件中的。大部分的配置信息在users.xml文件中&#xff0c;如果在users.xml文…

Elasticsearch:Jira 连接器教程第一部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 将我们的 Jira 内容索引到 Elaasticsearch 中以创建统一的数据源并使用文档级别安全性进行搜索。 在本文中&#xff0c;我们将回顾 Elastic Jira 原生连接器的一个用例。我们将使用一个模拟项目&#xff0c;其中一家银行正在开发…

Linux自学指南(学习路线大纲)

Linux入门与进阶指南 目录 第一部分 入门篇 第一章 Linux 系统 1.1 Unix&#xff1a;Linux的“祖师爷” 1.2 Linux 操作系统的诞生与发展历程 1.3 Linux 主要应用领域的归纳 1.4 开源社区的兴起 第二章 如何选择Linux发行版&#xff1f; 2.1 Debian GNU/Linux 2.2 Ubu…

CCLINKIE转ModbusTCP网关,助机器人“掀起”工业智能的“惊涛骇浪”

以下是一个稳联技术CCLINKIE转ModbusTCP网关&#xff08;WL-CCL-MTCP&#xff09;连接三菱PLC与机器人的配置案例&#xff1a;设备与软件准备设备&#xff1a;稳联技术WL-CCL-MTCP网关、三菱FX5UPLC、支持ModbusTCP协议的机器人、网线等。 稳联技术ModbusTCP转CCLINKIE网关&…

c#删除文件和目录到回收站

之前在c上遇到过这个问题&#xff0c;折腾许久才解决了&#xff0c;这次在c#上再次遇到这个问题&#xff0c;不过似乎容易了一些&#xff0c;亲测代码如下&#xff0c;两种删除方式都写在代码中了。 直接上完整代码&#xff1a; using Microsoft.VisualBasic.FileIO; using Sy…

windows远程桌面连接限定ip

1&#xff0c;Windows防火墙->高级设置->远程桌面 - 用户模式(TCP-In)->作用域->远程IP地址 2&#xff0c;启用规则

Linux 下配置 Golang 环境

go sdk 下载环境&#xff1a;https://golang.google.cn/dl/选择对应的版本&#xff1a; 使用 wget 直接拉包下载到服务器中 wget https://golang.google.cn/dl/go1.23.4.linux-amd64.tar.gz如果找不到 wget 命令&#xff0c;yum 下载 wget yum -y install wget配置 go 的环境…

打造更安全的Linux系统:玩转PAM配置文件

在Linux系统中&#xff0c;用户认证是确保系统安全的关键步骤。PAM&#xff08;可插拔认证模块&#xff09;为我们提供了一个非常灵活的框架&#xff0c;帮助我们管理各种服务的认证过程。其中&#xff0c;/etc/pam.d目录是PAM配置的核心部分&#xff0c;这里存放了每个服务所需…

LLM - 大模型 ScallingLaws 的 Causal/Masked (PLM) 目标系数差异 教程(2)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145188660 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

本地部署Web-Check网站检测与分析利器并实现远程访问实时监测

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本文我们将详细介绍如何在Ubuntu系统上使用Docker部署Web-Check&#xf…