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页验证的这些代码做清除,否则的话永远都是调的这些接口

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,并妥善处理好每一个问题。

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

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

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

相关文章

Linux环境变量与命令行参数

Linux环境变量与命令行参数 一.命令行参数1.语法2.应用1:简易计算器 二.环境变量1.环境变量的概念2.环境变量的作用3.进一步理解环境变量的作用4.常见环境变量5.导出环境变量(添加环境变量)6.环境变量的特性7.另一种获取环境变量的方式8.小功能:用于身份验证的代码9.补充:第三种…

Android--Jetpack--Lifecycle详解

富贵本无根&#xff0c;尽从勤里得 一&#xff0c;定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件&#xff08;Activity/Fragment&#xff09;生命周期状态信息&#xff0c;并且允许其观察者监听宿主生命周期状态变化。 顾名思义&#xff0c;Lifecycle的主…

【3DsMax】制作简单的骨骼动画

效果 步骤 首先准备4个板子模型展开放置好 添加一个4段的骨骼 选中其中的一块板子添加蒙皮命令 在蒙皮的参数面板中&#xff0c;设置每块板子对应哪块骨骼 设置好后你可以发现此时就已经可以通过骨骼来控制模型了 接下来就可以制作动画 点击左下角“时间配置”按钮 设置一下动…

网络程序设计

互相连接&#xff0c;发送信息 tcp和udp协议 tcp会有准备&#xff0c;udp不会准备。 8080端口&#xff1a;tomcat端口&#xff0c;java和web相连接 80端口&#xff1a;http 21端口&#xff1a;ftp 套接字 socket&#xff1a;提供给程序可以对外进行连接的接口 ip地址 …

Elk:filebeat 日志收集工具和logstash

Filebeat是一个轻量级的日志收集工具,所使用的系统资源比logstash部署和启动时使用的资源要小得多 Filebeat可以在非java环境使用&#xff0c;他可以代理logstash在非java环境上收集日志 缺点Filebeat无法实现数据的过滤,一般是结合logstash的 实验 ELK 企业级日志分析系统---…

Java第二十一章网络通信

一、网络程序设计基础 1、局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机&#xff0c;如下图所示。 2、网络协议 1.IP协议 IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。设计IP的目的…

C++ 拷贝构造函数

目录 拷贝构造函数概述 拷贝构造函数特性 拷贝构造函数概述 当我们定义好一个类&#xff0c;不做任何处理时&#xff0c;编译器会自动生成以下6个默认成员函数&#xff1a; 默认成员函数&#xff1a;如果用户没有手动实现&#xff0c;则编译器会自动生成的成员函数。 同样&…

Centos图形化界面封装OpenStack Ubuntu镜像

目录 背景 环境 搭建kvm环境 安装ubuntu虚机 虚机设置 系统安装 登录虚机 安装cloud-init 安装cloud-utils-growpart 关闭实例 删除细节信息 删除网卡细节 使虚机脱离libvirt纳管 结束与验证 压缩与转移 验证是否能够正常运行 背景 一般的镜像文件在上传OpenSt…

DBSCAN聚类算法学习笔记

DBSCAN聚类算法学习笔记 一些概念名词 MinPts&#xff1a;聚类在一起的点的最小数目&#xff0c;超过这一阈值才算是一个族群 核心点&#xff1a;邻域内数据点超过MinPts的点 边界点&#xff1a;落在核心点邻域内的点称为边界点 噪声点&#xff1a;既不是核心点也不是边界点的…

校园教务管理系统

学年论文&#xff08;课程设计&#xff09; 题目&#xff1a; 信息管理系统 校园教务管理系统 摘要&#xff1a;数据库技术是现代信息科学与技术的重要组成部分&#xff0c;是计算机数据处理与信息管理系统的核心&#xff0c;随着计算机技术的发展&#xff0c;数据库技…

OCP Java17 SE Developers 复习题08

答案 答案 答案 A. This code is correct. Line 8 creates a lambda expression that checks whether the age is less than 5, making option A correct. Since there is only one parameter and it does not specify a type, the parentheses around the parameter are …

h5如何跳转到微信公众号中

需求&#xff1a;点击按钮或者某个地方&#xff0c;弹出关注公众号的页面。&#xff08;h5跳转到微信公众号&#xff09; 需要什么&#xff1a;通过window.location.href来进行跳转。 因此&#xff0c;需要一个微信公众号链接。 一、打开想要跳转到的微信公众号的任何一篇文章&…

单片机_RTOS_架构

一. RTOS的概念 // 经典单片机程序 void main() {while (1){喂一口饭();回一个信息();} } ------------------------------------------------------ // RTOS程序 喂饭() {while (1){喂一口饭();} }回信息() {while (1){回一个信息();} }void main() {create_task(喂饭);cr…

一网打尽损失函数和正则化的关系,在损失函数中加入正则化有什么用,如何加入,这里为大家用通俗易懂的例子进行详细解释!(系列1)

文章目录 一、BP神经网络预测中&#xff0c;常见的损失函数是均方误差损失函数MSE二、L2正则化的公式如下&#xff1a;三、 结合MSE和L2正则化的总损失函数公式如下&#xff1a;总结 一、BP神经网络预测中&#xff0c;常见的损失函数是均方误差损失函数MSE 在BP神经网络预测中…

气膜厂家怎样确保产品质量和售后服务?

气膜厂家作为一家专业生产气膜产品的企业&#xff0c;确保产品质量和提供良好的售后服务是我们的责任和使命。为了确保产品质量和售后服务的可靠性&#xff0c;我们采取了以下措施。 起初&#xff0c;我们严格按照国家标准和相关行业规范进行生产。气膜产品的质量是产品能否长…

【JavaEE进阶】 Spring 的创建和使⽤

文章目录 &#x1f334;前言&#x1f38b;创建 Spring 项⽬&#x1f6a9;创建⼀个 Maven 项⽬&#x1f6a9;添加 Spring 框架⽀持&#x1f6a9;添加启动类 &#x1f333;存储 Bean 对象&#x1f6a9;创建Bean&#x1f6a9;将 Bean 注册到容器 &#x1f332;获取并使⽤ Bean 对象…

图解系列--Web服务器,Http首部

1.用单台虚拟主机实现多个域名 HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。。比如&#xff0c;提供 Web 托管服务&#xff08;Web Hosting Service&#xff09;的供应商&#xff0c;可以用一台服务器为多位客户服务&#xff0c;也可以以每位客户持有的域名运行各自不…

VSCode之C++ CUDA入门:reduce的N+1重境界

背景 Reduce是几乎所有多线程技术的基础和关键&#xff0c;同样也是诸如深度学习等领域的核心&#xff0c;简单如卷积运算&#xff0c;复杂如梯度聚合、分布式训练等&#xff0c;了解CUDA实现reduce&#xff0c;以及优化reduce是理解CUDA软硬件连接点的很好切入点。 硬件环境&…

模式识别与机器学习(七):集成学习

集成学习 1.概念1.1 类型1.2 集成策略1.3 优势 2. 代码实例2.1boosting2.2 bagging2.3 集成 1.概念 集成学习是一种机器学习方法&#xff0c;旨在通过组合多个个体学习器的预测结果来提高整体的预测性能。它通过将多个弱学习器&#xff08;个体学习器&#xff09;组合成一个强学…

空间金字塔池化(SPP,Spatial Pyramid Pooling)系列

空间金字塔池化的作用是解决输入图片大小不一造成的缺陷&#xff0c;同时在目标识别中增加了精度。空间金字塔池化可以使得任意大小的特征图都能够转换成固定大小的特征向量&#xff0c;下面针对一些典型的空间金字塔进行盘点。 部分图片来自blog:空间金字塔池化改进 SPP / SP…