Python+requests+unittest执行接口自动化测试详情

news2024/11/25 13:52:47

这篇文章主要介绍了Python+requests+unittest执行接口自动化测试详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

1、安装requests、xlrd、json、unittest库

<1>pip 命令安装:

pip install requests
pip install xlrd
pip install json
pip install unittest

2、创建六类Python Package

利用Page Object Model 设计理念创建六类Python Package(也可根据项目要求具体实施)

3、创建一个Base_Page.py

先在base包里创建一个Base_Page.py

<1>导入模块,并创建Base类,封装各类请求方法

1

2

3

4

5

6

7

8

9

10

import requests  #导入requests模块

class Base():  

    def method_post(self,url,params = None,data = None,headers = None,files = None):

        return requests.post(url = url,params = params,data = data,headers = headers,files = files)

    def method_get(self,url,params = None,data = None,headers = None,files = None):

        return requests.get(url = url,params = params,data = data,headers = headers,files = files)

    def method_put(self,url,params = None,data = None,headers = None,files = None):

        return requests.put(url = url,params = params,data = data,headers = headers,files = files)

    def method_delete(self,url,params = None,data = None,headers = None,files = None):

        return requests.delete(url = url,params = params,data = data,headers = headers,files = files

因为每一个请求都会有params参数或是data参数,但是不可能两个都存在,所以这里用了None,依次类推

<2>适配于接口用例执行,读取Excel表时,将各类请求做判断,当符合哪一种时,就去执行哪一种

1

2

3

4

5

6

7

8

9

def requests_type(self,method,url,params = None,data = None,headers = None,files = None):

        if method =='post' or method =='POST':

            return self.method_post(url = url,params = params,data = data,headers = headers,files = files)

        elif method =='get' or method =='GET':

            return self.method_get(url = url,params = params,data = data,headers = headers,files = files)

        elif method =='put' or method =='PUT':

            return requests.put(url = url,params = params,data = data,headers = headers,files = files)

        elif method =='delete' or method =='DELETE':

            return requests.delete(url = url,params = params,data = data,headers = headers,files = files)

<3> 将几种请求做简单调试,调试通了,那么我们就可以进行下一项

也可以对需要拿到cookie的接口进行封装方法保存:

1

2

3

def Get_Login_cookie(self,data):

        res = self.method_post(url = "请求网址",data = data)

        return {"userId":str(res.json()['result']['userId']),"sessionId":res.json()['result']['sessionId']}

之后我们要将base页验证的这些代码做清除,否则的话永远都是调的这些接口

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

 

4、创建common类

再common类下创建commons.py文件,并创建common类

<1> 封装日志方法

这里我添加了一个data包,用于存放xlrd表,以及html报告存放路径、log日志存放路径

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

log_path = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\logs'

report_html = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\html'

read_xlrd = r'D:\PycharmProjects\自动化接口\自动化接口测试\data'

class Common():

    #封装日志方法

    def get_logs(self,path = log_path):

        import logging,time

        logs = logging.getLogger()

        logs.setLevel(logging.DEBUG)

        path = path+'/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.log'

        write_file = logging.FileHandler(path,'a+',encoding='utf-8')

        write_file.setLevel(logging.DEBUG)

        set_logs = logging.Formatter('%(asctime)s - %(filename)s - %(funcName)s - %(levelname)s - %(message)s')

        write_file.setFormatter(set_logs)

        pycharm_text = logging.StreamHandler()

        pycharm_text.setFormatter(set_logs)

        logs.addHandler(write_file)

        logs.addHandler(pycharm_text)

        return logs

<2> 封装读取Excel表方法,把他转换成字典形式,方便json格式读取

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# 读取Excel表方法,方便后续读取接口用例数据

    def ReadExcelTypeDict(self,file_name,path = read_xlrd):

        path = path+'/' + file_name

        import xlrd

        work_book = xlrd.open_workbook(path)  # 打开Excel表

        sheets = work_book.sheet_names()  # 获取所有的sheets页

        DatasList = []

        for sheet in sheets:

            sheets = work_book.sheet_by_name(sheet)

            nrows = sheets.nrows

            for i in range(0,nrows):

                values = sheets.row_values(i)

                DatasList.append(values)

        title_list = DatasList[0]

        content_list = DatasList[1:]

        new_list = []

        for content in content_list:

            dic = {}

            for i in range(len(content)):

                dic[title_list[i]] = content[i]

            new_list.append(dic)

        return new_list   #最终返回为字典形式 有键和值

为什么要转换格式呢?

这里就涉及到了怎么设计一个自动化接口用例

用例的参数值要用json格式写入,不要有空格
预期结果的出参也要用json格式写入
不要有' '值都要用" "包起来

<3>封装一个生成HTML报告方法

1

2

3

4

5

6

7

# 封装一个HTML报告方法

    def GetHtmlResult(self,suite,title,path = report_html):

        import HTMLTestReportCN,time

        path = path + '/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.html'

        with open(path,'wb+') as f:

            run = HTMLTestReportCN.HTMLTestRunner(stream=f,description='用户相关接口测试报告',tester='小白',title = title)

            run.run(suite)

其余还有需要补充的可以继续添加,我这里三个基本够用

5、读取Excel数据表联合使用

在case包下创test用例,并调用我们在base页封装好的请求api以及common中的读取Excel数据表联合使用

<1>创建test_login.py

<2> 导入unittest、common类下的commons类、ddt数据驱动、Base下的base_page页

1

2

3

4

import unittest

import ddt

import 自动化接口测试.common.commons as common

from 自动化接口测试.base.Base_Page import Base

<3> 搭建unittest框架内部,并填充方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import unittest

import ddt

import 自动化接口测试.common.commons as common

from 自动化接口测试.base.Base_Page import Base

r = common.Common().ReadExcelTypeDict('cezxhi .xlsx'# 拿到具体的Excel表数据

@ddt.ddt  #导入ddt模块

class TestLogin(unittest.TestCase):

    @classmethod

    def setUpClass(cls) -> None# setupclass类方法  全部用例开始前执行一次

        cls.logs = common.Common().get_logs() # 导入日志方法

        cls.logs.debug('开始写入接口自动化测试用例')

    @classmethod

    def tearDownClass(cls) -> None:

        cls.logs.debug('自动化接口用例结束')

  

    def setUp(self) -> None:

        self.logs.debug('开始本条接口用例')

  

    def tearDown(self) -> None:

        self.logs.debug('结束本条用例')

  

    @ddt.data(*r) #  引入ddt模块,读取拿到的数据

    def test_logins(self,pars):  # 用例方法名开头必须已test  pars参数为接收的表数据值

        import json  #导入json模块

        dic = json.loads(pars['body参数值'])  # 将Excel数据中的参数值转变为json格式

        url = pars['接口地址'# 拿到请求url

        yuqi = pars['预期结果'# 拿到预期结果

        fs = pars['请求方式'] # 拿到请求方式

        result = Base().requests_type(method = fs,url = url,data = dic)  # 填充base页的请求api

        self.assertEqual(result.text,yuqi)  # 进行断言 看用例是否通过

<4> 执行用例后生成测试报告:

1

2

3

4

if __name__ == '__main__':

    load = unittest.TestLoader().loadTestsFromTestCase(TestLogin)  #使用loader加载方式 来找寻所有已test开头的用例

    suite = unittest.TestSuite([load,])

    common.Common().GetHtmlResult(suite,'登录测试用例')

<5> copy当前要执行的脚本路径,添加到运行方式为python里

最后我们run一下

控制台是这样的

为什么会有400呢?因为有一些接口是异常的,比如url错误的,少传入参数、空参,所以会出错,常理之中

<6> 看下生成的测试报告

在pycharm中是这样的

然后我们copy下他的路径到浏览器中查看

根据我追踪的信息,第一条失败是因为sessionId是可以变的,每一次的值都是不一样,在这里也希望大家能够找到BUG,并妥善处理好每一个问题。

到此这篇关于Python+requests+unittest执行接口自动化测试详情的文章就介绍到这了,更多相关Python接口测试内容请博主以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!

下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

资料获取方式 :

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

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

相关文章

【Web 表单】与用户数据打交道-1(mdn笔记)

0. Web 表单指南 我们将介绍 Web 表单的各个方面&#xff1a;HTML 结构、样式、验证表单数据&#xff0c;以及提交数据到服务器。 基本指南 你的第一个表单 第一次创建 HTML 表单的经验&#xff0c;包括设计一个简单表单、使用正确的 HTML 元素实现它、通过 CSS 添加一些非常简…

【图论】无向图连通性(tarjan算法)

割边&#xff1a;dfn[u]<low[v] 割点&#xff1a;dfn[u]<low[v] (若为根节点&#xff0c;要有两个v这样的点) 一.知识点&#xff1a; 1.连通&#xff1a; 在图论中&#xff0c;连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v&…

问道管理:券商板块再度活跃,西南证券3连板,太平洋6天5板

券商板块1日再度拉升&#xff0c;到发稿&#xff0c;财达证券、太平洋、西南证券涨停&#xff0c;首创证券、第一创业涨超5%。 值得注意的是&#xff0c;太平洋近6日已斩获5个涨停板。公司昨日晚间再次发布危险提示称&#xff0c;近日股票价格波动较大&#xff0c;特别提示广大…

分布式异步任务处理组件(四)

基于zookeeper的HA集群设计思路-- 各个节点都可以消费任务&#xff0c;但是由主节点来投票&#xff1b;主节点通过注册zookeeper的临时节点来选举--主节点需要同步从节点的信息正常工作机制--各个节点&#xff08;包括主节点本身&#xff09;在执行任务之前询问主节点&#xf…

2023最新版Nessus10.5+Awvs15.2+Routersploit+Kali

前言&#xff0c;为了方便大家使用&#xff0c;我们将AWVS、Nessus以及Routersploit集成在kali里面&#xff0c;开机即可享用。非常之方便&#xff0c;详情见下文。 0x01. AWVS AWVS是一款自动化的web漏洞扫描工具。能够发现比较常见的web漏洞&#xff0c;例如跨站脚本攻击&am…

【Mysql】group语句删除重复数据只保留一条

【Mysql】group语句删除重复数据只保留一条 【一】案例分析 假如在数据初始化的时候&#xff0c;insert脚本执行了两次&#xff0c;导致表里的数据都是重复的&#xff08;没有设置唯一键&#xff09;。这个时候再加上mybatis-plus的selectOne方法&#xff0c;就会出现报错。因…

Java阻塞队列

什么阻塞队列 阻塞队列&#xff08;BlockingQueue&#xff09;是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法&#xff1a;意思是当队列满时&#xff0c;队列会阻塞插入元素的线程&#xff0c;直到队列不满。支持阻塞的移除方…

高并发编程-2. 并发级别

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 原文 文章目录 阻塞无饥饿(Starvation-Free)无障碍(Obstruction-Free)无锁(Lock-Free)无等待 由于临界区的存在&#xff0c;多线程之间的并发必须受…

PCIE上位机用什么工具?

可以了解一下神电测控出器的My FPGA开发套件&#xff0c;它可以用来开发FPGA板卡与上位机之间PCIE通信&#xff0c;而且就是用LabVIEW FPGA开发。它使用的是Xillybus PCIe IP核&#xff0c;神电将其封装成了在 LabVIEW FPGA 下的 PCIe CLIP 组件&#xff0c;可以方便的使用。而…

2023年最新前端学习路线【超详细版】

第一个月、HTMLCSS 第1周安排&#xff1a; 是了解前端入门的第一步&#xff0c;要学会IDE插件安装和使用&#xff0c;掌握H5语法和基础标签的应用&#xff0c;学完本周可以进行简单的页面搭建。 1、了解前端行业发展2、了解HTML5对于网页的意义3、学习常用标签/属性&#xf…

流控平台Sentinel搭建和接入教程

流量控制和限流是大型系统必不可少的组成部分&#xff0c;Sentinel是Alibaba提供的一款特别好用的专业工具&#xff0c;属于那种看起来很牛&#xff0c;用起来也很牛的工具&#xff0c;下面记录一下接入的过程。 一&#xff0c;搭建平台 1&#xff0c;下载jar包 地址&#x…

组件(lvs,keeplive,orm,mysql,分布式事务)

lvs LVS 已经集成到Linux内核系统中&#xff0c;ipvsadm 是 LVS 的命令行管理工具。 目前有三种 IP 负载均衡技术&#xff08; VS/NAT 网络地址转换 、VS/TUN IP 隧道技术实现虚拟服务器 和 VS/DR 直接路由&#xff09;&#xff1b; 八种调度算法&#xff1a;轮询 …

解决ComposerStaticInit类重复加载问题

Tp5中composer安装phpoffice后报错 Cannot declare class Composer\Autoload\ComposerStaticInit6c9266e89aa536667bf36f59ad8e6e6b, because the name is already in use 错误原因: 使用ThinkPHP5框架的项目&#xff0c;在引用某些包的时候&#xff0c;可能会通过其它包&…

java判断字符串是否和空字符串(““)相等、是否和空引用(null)相等,比较顺序不同导致出现死代码(Dead code)

我在用Java实现需求的时候&#xff0c;用到了字符串跟空字符串&#xff08;“”&#xff09;比较&#xff0c;跟空引用null比较&#xff0c;两个比较语句的顺序不同&#xff0c;一个顺序出现了死代码&#xff08;Dead code&#xff09;。 下面这个代码片段&#xff0c;字符串li…

【Rust 日报】2023-07-30 Lemmy v0.18.3发布

Lemmy v0.18.3发布 Lemmy 与 Reddit、Lobste.rs 或 Hacker News 等网站类似&#xff1a;你可以订阅你感兴趣的论坛&#xff0c;发布链接和讨论&#xff0c;然后进行投票或评论。但在幕后&#xff0c;Lemmy 和他们不同 —— 任何人都可以很容易地运行一个服务器&#xff0c;所有…

数字化转型才是王道!零售行业的关键五大指标都在这里了,快收藏

新零售是指结合线上和线下的销售模式&#xff0c;利用数字化技术和数据分析手段&#xff0c;通过线上平台吸引消费者&#xff0c;在线下店铺提供更加个性化和便捷的购物体验。 新零售不再将线上和线下视为两个独立的销售渠道&#xff0c;而是将其整合为一个完整的销售生态系统…

RabbitMQ 教程 | 第4章 RabbitMQ 进阶

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

Navicat for Mysql8.xx 字段注释中文乱码解决方

问题摘要&#xff1a; Navicat 中表描述中文均正常&#xff0c;只有字段注释中文乱码&#xff0c;原因是系统本身编码&#xff08;命令行chcp&#xff09;中为936&#xff08;GBK&#xff09;而不是65001&#xff08;UTF8)造成的 使用场景&#xff1a; Navicat for MySQL&am…

10分钟掌握seaborn绘制多子图

公众号&#xff1a;尤而小屋作者&#xff1a;Peter编辑&#xff1a;Peter 大家好&#xff0c;我是Peter~ 本文介绍如何使用seaborn绘制多子图 In [1]: import matplotlib.pyplot as plt %matplotlib inlineimport seaborn as sns import plotly_express as pximport warnin…

ELK高级搜索(一)

文章目录 ELK搜索1&#xff0e;简介1.1 内容1.2 面向 2&#xff0e;Elastic Stack2.1 简介2.2 特色2.3 组件介绍 3&#xff0e;Elasticsearch3.1 搜索是什么3.2 数据库搜索3.3 全文检索3.4 倒排索引3.5 Lucene3.6 Elasticsearch3.6.1 Elasticsearch的功能3.6.2 Elasticsearch使…