Python3+requests搭建接口自动化测试框架

news2024/10/7 13:25:15

 目录

一、接口自动化的意义(为什么做这个框架)

二、准备工作

三、框架流程及逻辑

四、各模块介绍

五、具体使用

一、接口自动化的意义(为什么做这个框架)

     新版本上线时之前版本的功能需要进行回归测试,导致大量的重复性手工测试。引入自动化测试可以使用自动化技术代替部分手工的回归性测试,解放更多人力做其它更有必要的事情。但目前项目UI变动频繁,而接口一般不会做大变动所以先暂时做接口自动化。使用接口自动化可以做上线前接口功能的回归性测试,也可以定时巡检线上环境接口的运行情况,能及时发现线上环境接口问题并解决。同时此框架可以帮助不会写代码的测试同事进行接口自动化的相关工作。

二、准备工作

    开发语言:Python3

    需要安装的模块:

        Requests: python的一个HTTP客户端库,和urllib、urllib2类似。

                1、安装方法:

使用pip安装

pip install Requests

或 

python3 -m pip install Requests

                                                       

                              下载源码后安装

git clone git://github.com/kennethreitz/requests.git

cd requests

python setup.py install

                2、学习路径:

        xlsxwriter :是python用来构造xlsx文件的模块,可以完成xlsx文件的自动化构造,包括:合并单元格,制作excel图表等功能。

                1、安装方法:

使用pip安装

pip install Requests

或 

python3 -m pip install Requests

                2、学习路径:

三、框架流程及逻辑

    框架理念:使用json文件编写测试用例,建一个脚本循环读取测试用例并执行,然后对比返回的接口和用例中的期望结果。将测试结果写入到一个excel表格中生成测试报告,最后使用发送邮件功能将测试报告发送到指定邮箱。其中对所有公共方法进行封装并放在common公共文件目录下。        

四、各模块介绍

----interface_test                             项目文件夹目录

    ----common                                存放公共方法目录

            ----__init__.py                    初始化文件

            ----conf.py                          操作配置文件相关方法

            ----excelaction.py                Excel文件相关操作方法

            ----jsonaction.py                 Json文件相关操作方法

            ----logger.py                       记录日志的相关方法

            ----newfile.py                      获取最新文件的相关方法

            ----sendmail.py                   发送报告到指定邮箱的相关方法

            ----signture.py                    对数据进行签名的相关方法

            ----userinfo.py                    获取用户信息的相关方法

            ----config_test.conf             基本配置文件

    ----logs                                       存放日志的目录

    ----report                                    存放测试报告的目录

    ----test_data                                存放测试用例数据的目录

            ----login-1.json                    登录接口的测试用例数据

            ----logout-2.json                  退出登录接口的测试用例数据

    ----execute_test.py                       读取测试用例并执行测试用例

    ----test.bat                                    运行测试项目的批处理文件

execute_test.py 主要程序
 

 1 # -*- coding: utf-8 -*-                                                                
  2 #!/usr/bin/env python                                                                
  3 import os                                                                                        
  4 import json                                                                                    
  5 import requests                                                                                            
  6 import common.conf as conf                                                                                                                        
  7 import common.excelaction as excelaction                                                                                                                
  8 from common.sendemail import sendreport                                                                                                            
  9 from common.signture import sign                                                                                            
 10 import common.userinfo as userinfo                                                                                                        
 11 import common.logger as logger                                                                                                                        
 12 import sys                                                                                                                                
 13 import time                                                                                                                                
 14                                                                                                                                                                                         
 15 #data_path = os.path.dirname(__file__) + '\\test_data\\' # 测试用例数据文件所在目录                                                                            
 16 data_path = conf.testdata_path                                                                                                                    
 17                                                                                                                                                                                             
 18 test_reports = [] # 添加一个数组用来存储测试结果                                                                                                      
 19 for file in os.listdir(data_path): # 循环读取目录下的文件                                                                                                                                                 
 20     child = os.path.join('%s%s'%(data_path,file)) # 将文件名和路径拼接好                                                                                
 21     logger.info("当前打开的文件:"+child)                                                                                                                                   
 22     fl = open(child) # 打开文件                                                                                                                                             
 23     try:                                                                                                                                                                                                
 24         cases = json.load(fl)                                                                                                                    
 25         for key in cases: # 循环读取文件中的测试用例(case)                                                                                            
 26             start_time = time.clock()                                                                                                            
 27             case = cases[key]                                                                                                                
 28             url = conf.get_conf('module',case['module']) + case['url']                                                                                                        
 29             data = case['data']                                                                                                                    
 30             data['Platform'] = conf.get_conf('params','Platform')                                                                                            
 31             data['Terminal'] = conf.get_conf('params','Terminal')                                                                        
 32             data['UserIP'] = conf.get_conf('params','UserIP')                                                                                        
 33             data['Version'] = conf.get_conf('params','Version')                                                                                            
 34             if "UserToken" in data and data['UserToken'] == '':                                                                                                    
 35                 data['UserToken'] = userinfo.get_token()                                                                                                
 36             hope_result = case['assert']                                                                                                
 37             method = case['method']                                                                                                    
 38             test_report = {                                                                                                                        
 39                 "case_id":case['id'],                                                                                                                
 40                 "t_name":case['name'],                                                                                                                
 41                 "method":method,                                                                                                                    
 42                 "url":url,                                                                                                                                
 43                 "params":data,                                                                                                                
 44                 "hope_result":hope_result,                                                                                                    
 45                 "actual_result":[],                                                                                                                    
 46                 "test_result":""                                                                                                                                
 47             }                                                                                                                                                                   
 48             try:                                                                                                                                                    
 49                 if method == 'post':                                                                                                                            
 50                     addsign_data = sign(data,conf.get_conf('sign','api_key'))                                                                                    
 51                     r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)                                                                            
 52                     response = r.json()                                                                                                    
 53                     s = True                                                                                                                    
 54                     for k in hope_result:                                                                                                            
 55                         ar = str(k) + ":" + str(response[k])                                                                                                
 56                         test_report["actual_result"].append(ar)                                                                                            
 57                         if type(hope_result[k]) == type(''):                                                                                                
 58                             if hope_result[k] in response[k]:                                                                                            
 59                                 s = s&True                                                                                                            
 60                             else:                                                                                                                    
 61                                 s = s&False                                                                                                        
 62                         else:                                                                                                                                
 63                             if hope_result[k] == response[k]:                                                                                            
 64                                 s = s&True                                                                                                                                                                                            
 65                             else:                                                                                                                
 66                                 s = s&False                                                                                                                
 67                     if s:                                                                                                                                   
 68                         test_report["test_result"] = "PASS"                                                                                            
 69                     else:                                                                                                                            
 70                         test_report["test_result"] = "Fail"                                                                                        
 71                                                                                                                                                                                                     
 72                 elif method == 'get':                                                                                                        
 73                     addsign_data = sign(data,conf.get_conf('sign','api_key'))                                                                                    
 74                     r = requests.get(url,params=addsign_data,headers=conf.header)                                                                            
 75                     response = r.json()                                                                                                        
 76                     s = True                                                                                                                                
 77                     for k in hope_result:                                                                                                            
 78                         ar = str(k) + ":" + str(response[k])                                                                                        
 79                         test_report["actual_result"].append(ar)                                                                                        
 80                         if type(hope_result[k]) == type(''):                                                                                                    
 81                             if hope_result[k] in response[k]:                                                                                                    
 82                                 s = s&True                                                                                                            
 83                             else:                                                                                                                
 84                                 s = s&False                                                                                                                    
 85                         else:                                                                                                                                    
 86                             if hope_result[k] == response[k]:                                                                                                        
 87                                 s = s&True                                                                                                                            
 88                             else:                                                                                                    
 89                                 s = s&False                                                                                                                
 90                     if s:                                                                                                        
 91                         test_report["test_result"] = "PASS"                                                                                                    
 92                     else:                                                                                                                                
 93                         test_report["test_result"] = "Fail"                                                                                                        
 94                                                                                                                                                                             
 95                 else:                                                                                                                                    
 96                     print(u'暂不支持该请求方式')                                                                                                                                    
 97                 test_reports.append(test_report)                                                                                                                        
 98                 end_time = time.clock()                                                                                                                    
 99                 str_time = '当前执行的用例:' + key + '_'*4 + '用例执行所用时间:' + str(end_time-                                                                                                    start_time) + 's'                                                                                                                                    
100                 logger.info(str_time)                                                                                                        
101             except:                                                                                                                                
102                 error_msg = sys.exc_info()                                                                                                                                        
103                 logger.error(error_msg)                                                                                                                
104                 continue                                                                                                                                    
105     except:                                                                                                                                    
106         error_msg = sys.exc_info()                                                                                                                
107         logger.error(error_msg)                                                                                                                    
108         continue                                                                                                                                            
109                                                                                                                                                                                                 
110 excelaction.creat_report(test_reports) #生成测试报告                                                                                        
111 sendreport() #发送测试报告                                         

五、具体使用

1、在配置文件做对应项目的基础配置

[email] -- 邮箱相关配置

sender = ***@163.com -- 发件邮箱

receiver = ***@163.com -- 收件邮箱

smtpserver = smtp.163.com -- 发件邮箱服务器

username = ***@163.com -- 发件邮箱账户名

password = **** -- 发件邮箱密码(用于第三方登录的秘密)

[module] -- 模块相关接口域名配置

passport = http://passport.XXX.com/ -- 对应模块接口域名

[sign] -- 签名相关的配置

api_key = XXX-XXX -- 生成签名的key(填写项目对应的key)

[params] -- 接口参数配置(配置公共参数)

Platform = 1 -- 根据对应项目配置对应的公共参数和对应值

2、在test_data文件夹内用json文件写测试用例和对应参数 
"case1":{
    "name":"登录接口_测试正常登录",        -- 接口名称(或者接口简介)
    "module":"passport",                -- 接口所属模块
    "url":"/api/Passport/Login",            -- 接口地址(完整地址由模块对应域名+该地址拼接)
      "method":"post",                    -- 接口请求方式
      "id":"1-001",                        -- 用例ID
    "data":{                            -- 接口请求参数(请求时由该参数加公共参数)
        "UserName":"XXX",                -- 接口请求参数(根据具体接口补充,如果接口需要token则需要加token关键字(值为空就行),接口请求时会自动根据参数生成Sign,如果想自己定义则需要加Sign关键字(值填写自己定义的))
        },
    "assert":{                            -- 该条测试用例的断言条件
        "Status":200,                    -- 具体的断言条件,需要返回状态为200
        "Message":"登录成功"            -- 具体的断言条件
        }
    }
 

3、配置好基础配置和编写完测试用例后,运行项目中的test.bat文件。运行完成后会在report文件夹内生成测试报告文件,在logs文件夹内会生成测试运行过程中的记录日志和报错日志(如果有)。

新手写博客,把自己学习过程中的收获和问题在博客上记录。欢迎大家在评论区进行指点,希望能越来越好。

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对文件中的数据进行排序

#include<stdio.h> #include<stdlib.h> #include<time.h> int main()//生成1000个随机数据 {srand((size_t)time(NULL));FILE* fpfopen("d:/data.txt","w");if(!fp) return -1;for(int i0;i<1000;i)fprintf(fp,"%d\n",ran…

【Git】保姆级教程:如何在 GitHub 上传大文件(≥100M)?(含自己的操作流程)

文章目录 一、问题导读二、自己的实际操作流程2.1 准备工作2.2 初始化仓库2.3 安装git lfs&#xff08;一个仓库里面执行一次就好了&#xff09;2.4 跟踪一下你要上传&#xff08;push&#xff09;的文件或指定文件类型2.5 添加.gitattributes2.6 添加要上传&#xff08;push&a…

Jmeter上传文件接口测试

Jmeter上传文件接口测试 接口测试&#xff0c;想必大家都做过&#xff0c;但是上传文件的接口&#xff0c;可能就不知所措。其实呢&#xff0c;还是那么回事~ 一、接口的业务 在接口文档缺失的前提下&#xff0c;那就从抓包玩起~Fiddler或者F12都可以。 本次我们接口实现的…

springboot+mysql实现特产销售平台

本次设计任务是要设计一个藏区特产销售平台&#xff0c;通过这个系统能够满足藏区特产销售管理的管理功能。系统的主要包括首页、个人中心、用户管理、特产信息管理、特产分类管理、特产分类管理、特产评分管理、系统管理、订单管理等功能。 管理员可以根据系统给定的账号进行登…

Graphics笔记

1.简介 Graphics是System.Drawing里面的绘图类。 2.开始绘制 2.1.创建绘图对象&#xff0c;三种方法 在窗体或控件的Paint事件中&#xff0c;用PaintEventArgs创创建绘图对象(控件或窗体重绘时&#xff09; /// <summary>/// 1.在窗体或控件的Paint事件中&#xff0c…

以数字孪生技术服务社会,推动企业高质量发展

随着“十四五”规划和2035年远景目标纲要中提出&#xff0c;要加快数字化发展&#xff0c;建设数字中国。为建设数字孪生智慧城市提供了国家战略指引。 新兴技术是数字孪生发展的助推剂&#xff0c;臻图信息通过数字孪生技术及研发的实景三维渲染引擎&#xff0c;搭载自主研发的…

IP地址【图解TCP/IP(笔记十)】

文章目录 IP地址的基础知识IP地址的定义IP地址由网络和主机两部分标识组成IP地址的分类广播地址IP多播子网掩码 IPv4首部 IP地址的基础知识 在用TCP/IP通信时&#xff0c;用IP地址识别主机和路由器。为了保证正常通信&#xff0c;有必要为每个设备配置正确的IP地址。在互联网通…

使用Gradio库进行交互式数据可视化:Timeseries模块介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

计算机体系结构基础知识介绍之硬件预测(二)

一、ROB详述 指令执行的四个步骤是&#xff1a; 发射&#xff08;Issue&#xff09;&#xff1a;从指令队列中获取一条指令。如果有空闲的保留站和ROB条目&#xff0c;就发射指令&#xff1b;如果寄存器或ROB中有可用的操作数&#xff0c;就发送操作数到保留站。更新控制字段…

gigachad1靶机详解

gigachad_vh靶机详解 扫描到ip后对ip做一个全面扫描&#xff0c;发现有一个匿名服务器&#xff0c;是可以免密登陆的。 登陆上后发现就一个文件&#xff0c;get到我们电脑上。 file一下发现是一个zip文件&#xff0c;unzip解压一下&#xff0c;发现给了一个用户名chad&#xf…

ESP32设备驱动-直流电机与L298N电机驱动器

直流电机与L298N电机驱动器 文章目录 直流电机与L298N电机驱动器1、L298N介绍2、硬件准备3、软件准备4、驱动实现在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。 1、L298N介绍 L298N 电机驱动器模块非常易于与微控制器一起使用,而且相对便宜。 它被广泛…

基于springboot的微信小程序宠物领养医院系统(源代码+数据库+10000字论文)085

基于springboot的微信小程序宠物领养医院系统(源代码数据库10000字论文)085 一、系统介绍 本项目有网页版和小程序端 本系统分为管理员、医生、用户三种角色 用户角色包含以下功能&#xff1a; 登录、注册、宠物领养、医生在线咨询、查看挂号、个人中心、密码修改、宠物寄…

HTTP第18讲——HTTP的缓存控制

诞生背景 由于链路漫长&#xff0c;网络时延不可控&#xff0c;浏览器使用 HTTP 获取资源的成本较高。所以&#xff0c;非常有必要把“来之不易”的数据缓存起来&#xff0c;下次再请求的时候尽可能地复用。这样&#xff0c;就可以避免多次请求 - 应答的通信成本&#xff0c;节…

测试工程师简历编写指南,送简历模板

目录 概述 简历元素 1. 基础信息 2. 个人情况 3. 教育背景 4.专业技能 5.工作经历&项目经 6. 自我评价&兴趣爱好 7. 其他内容 总结&#xff1a; 概述 在人才市场中&#xff0c;一次完整的求职过程通常包括以下阶段&#xff1a; 简历筛选电话面试笔试面谈意向…

Linux信号机制-3

转自&#xff1a;深入理解Linux内核——signals | linkthinking 信号很早就在 unix 系统中出现了&#xff0c;它用于用户进程之间的交互&#xff0c;几十年以来&#xff0c;变化都不大。信号是一个发送给进程或者进程组的消息&#xff0c;它只是一个数字&#xff0c;没有参数或…

spring AOP中pointcut表达式详解

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

纹理过滤方式

纹理坐标不依赖于分辨率&#xff0c;opengl需要知道如何将纹理像素映射到纹理坐标。 纹理像素和纹理坐标的区别&#xff1a; 纹理像素是有限的。 纹理坐标的精度是无限的&#xff0c;可以是任意的浮点值。 一个像素需要一个颜色。 因此&#xff0c;所谓采样就是通过纹理坐标获取…

图像处理之图像灰度化

图像灰度化 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定&#xff0c;而每个分量有255中值可取&#xff0c;这样一个像素点可以有1600多万 (255255255)的颜色的变化范用。而灰度图像是R、G、B三个分量相同的一种特…

分析 jsjiami.v6 代码混淆和加密技术:特点、优点和缺点

当涉及到 JavaScript 代码混淆和加密技术时&#xff0c;开发人员常常寻求方法来保护他们的代码免受逆向工程和未授权访问的威胁。这种技术可以增加代码的复杂性&#xff0c;使其难以理解和修改&#xff0c;同时也可以隐藏关键信息和保护数据的安全性。本文将探讨 JavaScript 代…

echarts在vue上使用模版可粘贴!!!一站式搞定以及动态数据渲染关键问题解决(附带模版)

阿丹&#xff1a; 之前的项目中涉及到echarts都是使用jsp写的&#xff0c;但是现在越来普及vue。所以使用在vue上使用echarts就成了问题。 导入相关依赖 在官网上面有说明npm安装Echarts依赖 在vue中使用Echarts 上模版!!!!!!!!!!!!使用了mounted&#xff08;&#xff09;这个…