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

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

            新版本上线时之前版本的功能需要进行回归测试,导致大量的重复性手工测试。引入自动化测试可以使用自动化技术代替部分手工的回归性测试,解放更多人力做其它更有必要的事情。但目前项目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文件夹内会生成测试运行过程中的记录日志和报错日志(如果有)。

Python接口自动化测试零基础入门到精通(2024最新版)

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

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

相关文章

RDD算子——转换操作(Transformations )【map、flatMap、reduceByKey】

一、map map 算子 # spark-shell sc.parallelize(Seq(1, 2, 3)).map( num > num * 10).collect()# IDEA Test def mapTest(): Unit {// 1. 创建RDDval rdd1 sc.parallelize(Seq(1, 2, 3))// 2. 执行 map 操作val rdd2 rdd1.map(item > item * 10)// 3. 得到结果val re…

【基础工具篇使用】ADB 的安装和使用

文章目录 ADB的命令安装ADB 命令使用查看帮助 ——adb help查看连接设备 ADB的命令安装 ADB 命令的全称为“Android Debug Bridge”,从英文中看出主要是用作安卓的调试工具。ADB 命令在嵌入式开发中越来越常用了 在 Windows 上按“win”“R”组合件打开运行, 输入 …

astadmin安装querylist插件Puppeteer

我本来是想在linux服务器上安装,折腾了一天也没安装成功,由于急着用,就先做window10上安装了,以后有时间再研究centos7上安装 一 首先需要安装fastadmin 框架和querylist插件 这个大家可以自行安装,querylist安装地址…

LitJson-Json字符串转对像时:整型与字符串或字符串转:整型进的类型不一致的处理

目录 问题描述上代码测试代码各位看官,打赏个1元吧 Json数据格式是大家在游戏开中常量用的一种数据格式,某种程度上可以说是必备的。对unity开发来说,LitJson这个json库应该是被使用最多的json库了。 问题描述 今天说要的其中的这个api: Jso…

Arcgis像元统计数据

目录 单幅影像统计多幅影像统计 单幅影像统计 现有一幅NDVI影像,如何知道影像中NDVI的分布情况呢? 先栅格转点,然后在属性表中查看汇总情况 还有一种方法就是在ENVI中打开, -0.3-0.338占据了99% 多幅影像统计 现有多幅NDVI影…

用css给宽高不固定的矩形画对角线

.kong{width: 200rpx;height: 76rpx;background: linear-gradient(to bottom right, #E5E5E5 0%, rgba(0, 0, 0, 0.1) calc(50% - 1px),#175CFF 50%, rgba(0, 0, 0, 0.1) calc(50% 1px),rgba(0, 0, 0, 0.1) 100%);}参考: https://blog.csdn.net/weixin_38779534/a…

Qt实现简单的分割窗口

最近在学习一些关于Qt的新知识,今天来讲述下我学习到的窗口分割,如果有不正确的,大家可以指正哦~ 首先,先看一下实现之后的简单效果吧!省的说的天花乱坠,大家却不知道说的是哪个部分。 功能实现 整体demo…

【算法与数据结构】70、LeetCode爬楼梯

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:   程序如下: 复杂度分析: 时间复杂度: O ( ) O() O()。空间复…

第四站:C/C++基础-指针

目录 为什么使用指针 函数的值传递,无法通过调用函数,来修改函数的实参 被调用函数需要提供更多的“返回值”给调用函数 减少值传递时带来的额外开销,提高代码执行效率 使用指针前: 使用指针后: 指针的定义: 指针的含义(进阶): 空指针…

Android 正圆

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"wrap_content"android:layout_height"wrap_content"android:padding&…

x-cmd pkg | gh - GitHub 官方 CLI

目录 简介首次用户功能特点与 x-cmd gh 模块的关系相关作品进一步探索 简介 gh&#xff0c;是由 GitHub 官方使用 Go 语言开发和维护的命令行工具&#xff0c;旨在脚本或是命令行中便捷管理和操作 GitHub 的工作流程。 注意: 由于 x-cmd 提供了同名模块&#xff0c;因此使用官…

Java版商城:Spring Cloud+SpringBoot b2b2c实现多商家入驻直播带货及 免 费 小程序商城搭建的完整指南

随着互联网的快速发展&#xff0c;越来越多的企业开始注重数字化转型&#xff0c;以提升自身的竞争力和运营效率。在这个背景下&#xff0c;鸿鹄云商SAAS云产品应运而生&#xff0c;为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…

OpenFeign服务调用

一、Feign Feign 是一个声明式webservice客户端,使用Feign 能让编写Web Service客户端更简单 &#xff0c;它的使用方法是 定义一个服务接口然后在上面添加注解。Spring Cloud对Feign 进行了封装&#xff0c;使其支持了Spring Mvc 标准注解和HttpMessageConverters ,Fegin可以…

【Python】 python简介开发环境

1. python简介 Python是由荷兰人吉多范罗苏姆 (Guido von Rossum&#xff0c;后面称呼为Guido,"龟叔“)发明的一种编程语言&#xff0c;是目前世界上最受欢迎和拥有最多用户群体的编程语言。 (1).Python的历史 1.1989年圣诞节:Guido开始写Python语言的编译器。 2.1991年…

大创项目推荐 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

【Spring】17 @Component 注解

文章目录 1. 定义2. 好处3. 示例代码4. 组件命名总结 在 Spring 框架中&#xff0c; Component 注解是一个 通用的注解&#xff0c;用于标识一个类为 Spring 容器管理的 组件。它就可以让这个类成为 Spring IoC 容器中的一个 Bean&#xff0c;并允许 通过扫描机制自动发现和…

玩转Mysql 五(MySQL索引)

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 一、索引的数据结构 1、MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是…

Python2048小游戏核心算法(python系列26)

前言&#xff1a;做核心算法之前我们可以玩一玩这个小游戏来了解一下规则。2048在线试玩 运行效果&#xff1a; 代码案例&#xff1a; # 2048小游戏# 1.将列表中零移动到列表的末尾 def move_zeroes():x 0for i in range(len(list_nums)):if list_nums[i] ! 0:list_nums[x],…

“单项突出”的赢双科技IPO加速,比亚迪是最强助力?

近日&#xff0c;新能源汽车核心部件供应商赢双科技首次递表科创板&#xff0c;其凭借旋转变压器产品就坐稳了新能源车企主要供应商的地位&#xff0c;从核心业务及业绩情况来看&#xff0c;赢双科技不愧为“单项冠军”。 据悉&#xff0c;赢双科技本次IPO拟募资8.47亿元&…

两种MinIO分布式集群部署方式

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 相关文章推荐&#xff1a; 对象存储MinIO的简介与部署 记录一次跨越16个月的minio版本升级与数据迁移 MinIO集群怎么接入Prometh…