百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python3+requests+unittest接口自动化测试实战

itomcoil 2025-03-30 17:43 6 浏览

一、Requests介绍

Requests is an elegant and simple HTTP library for Python, built for human beings.

翻译过来就是:Requests 是为人类写的一个优雅而简单的 Python HTTP 库。这个介绍很直白了,让我们先来感受一下 Requests 的威力。

import requests
 
# 发送请求
response = requests.get(url="http://www.baidu.com/s", params={'wd':'python'})
# 处理响应
print(response.status_code)
 
#返回
200

这个请求如果用 urllib 来实现,代码如下:

import urllib.parse
import urllib.request
 
url = "http://www.baidu.com/s"
params = urllib.parse.urlencode({'wd':'python'})
# 发送请求
response = urllib.request.urlopen('?'.join([url, params]))
# 处理响应
print(response.getcode())
 
#返回
200

从感官上就能看出来,使用 urllib 在 URL 、参数等方面会复杂一些。这只是冰山一角,实际使用中 Requests 还有好多方面超越 urllib ,它并不是浪得虚名,接下来的学习中你就会感受到。

二、unittest介绍

说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是unittest。 的确,作为 Python 的标准库,它很优秀,并被广泛用于各个项目。但你知道吗?其实在 Python 众多项目中,主流的单元测试框架远不止这一个。

本系列文章将为大家介绍目前流行的 Python 的单元测试框架,讲讲它们的功能和特点并比较其异同,以让大家在面对不同场景、不同需求的时候,能够权衡利弊,选择最佳的单元测试框架。

三、Python3+requests+unittest

首先,我们可以捋一捋思路,想一想接口测试的流程

其次,选择合适的框架

流程清晰之后,我们需要选择一个合适的框架,于是选择了Python3+requests+unittest框架

Requests模块发送http的网络请求,请求类型主要包含了post,get, PUT,DELETE,HEAD

python+unittest单元测试框架构成,和测试报告生成(HTMLTestRunner)

框架详解不在此赘述

基于以上,我们来一步步搭建我们的框架。在这个过程中,我们需要做到业务和数据的分离,这样才能灵活,达到我们写框架的目的。接下来,我们来进行结构的划分。

我们的结构是这样的

data:存放自动化测试所用到的数据文档

log:存放生成的日志文件

base:存放公共的方法

report:存放生成的自动化测试报告

testcase:存放测试脚本

接下来,公共方法的开发

整体结构有了划分,接下来就该一步步的填充整个框架了,我们先来看看Base文件中的公共类或函数,这主要用于后续测试case的调用,所有公共的、一成不变的数据都可以放在这里,维护也方便

配置文档如下

[DATABASE]
data_address = ./data/
report_address = ./report/
 
[HTTP]
base_url = http://xxx.xx
 

想知道怎样从配置文档中得到或写入相应的数据吗?那继续看吧

import os
import configparser
 
# 获取当前py文件地址
proDir = os.path.split(os.path.realpath(__file__))[0]
# 组合config文件地址
configPath = os.path.join(proDir,"config.ini")
 
class ReadConfig:
    def __init__(self):
        #获取当前路径下的配置文件
        self.cf = configparser.ConfigParser()
        self.cf.read(configPath)
 
    def get_config(self,field,key):
        #获取配置文件中的key值
        result = self.cf.get(field,key)
        return result
 
    def set_config(self,field,key,value):
        #向配置文件中写入配置信息
        fb = open(configPath,'w')
        self.cf.set(field,key,value)
        self.cf.write(fb)
 

那问题又来了,我们的测试数据放在哪里?怎么取值?怎么写入?怎么保存?。。。

别急,接着往下看

测试数据优先考虑放在excel或database中,此处以excel为例做个简单介绍

这里需要用到两个操作表格的库,xlrd数据驱动的读取,作用于excel文档,但xlrd不能写入数据,所以引入xlutils数据驱动的读取和写入

安装方法可以用pip3 install xlrd和pip3 install xlutils 来安装。

import xlrd
import xlutils.copy
from Base.readConfig import ReadConfig
import time
 
class ReadExcel:
 
    def __init__(self,section,field,sheet):
        # 打开工作表,并定位到sheet
        data_address = ReadConfig().get_config(section,field)
        workbook = xlrd.open_workbook(data_address)
        self.table = workbook.sheets()[sheet]
 
 
    def get_rows(self):
        # 获取excel行数
        rows = self.table.nrows
        return rows
 
    def get_cell(self,row,col):
        # 获取单元格数据
        cell_data = self.table.cell(row,col).value
        return cell_data
 
    def get_col(self,col):
        # 获取整列数据
        col_data = self.table.col_value(col)
        return col_data
 
class WriteExcel:
    def __init__(self,section,field,sheet):
        # 打开工作表
        self.address = ReadConfig().get_config(section,field)
        self.workbook = xlrd.open_workbook(self.address)
        self.wf = xlutils.copy.copy(self.workbook)
        self.ws = self.wf.get_sheet(sheet)
 
    def set_cell(self,row,col,value):
        #设置单元格数据
        self.ws.write(row,col,value)
 
    def save_excel(self,filename,format):
        #获取当前时间
        self.time = time.strftime("%Y%m%d%H%M%S", time.localtime())
        #生成文件的文件名及格式
        self.report = filename + '_' +self.time + format
        #保存文件
        self.wf.save(self.report)

然后,测试脚本的编辑

一切准备就绪,下面通过一个简单的、完整的代码进行演示公共函数的调用,框架的使用及报告的生成

import unittest
import requests
from Base.readConfig import ReadConfig
from Base.readExcel import ReadExcel
from Base.readExcel import WriteExcel
#实例化
readexcel = ReadExcel('DATABASE','data_address',0)
writeexcel = WriteExcel('DATABASE','data_address',0)
 
class testcase(unittest.TestCase):
    #初始化
    def setUp(self):
        #获取url
        self.base_url = ReadConfig().get_config('HTTP', 'base_url')
        self.url = self.base_url + readexcel.get_cell(1,1)
        #获取请求头
        self.headers = readexcel.get_cell(1,4)
 
    def test_case(self):
        nok = 0
        ner = 0
        # 循环读取excel中的测试数据,进行结果验证,并生成excel形式的测试报告
        for i in range(3,readexcel.get_rows()):
            #发送网络请求,得到响应值
            response = requests.post(self.url, headers=self.headers,   data=readexcel.get_cell(i,4).encode('utf-8'))
            actualresult = response.json()
            #获取excel中的预期结果
            expectresult = eval(readexcel.get_cell(i,6))
            # 获取需验证的数据
            key = eval(readexcel.get_cell(i, 5))
            keylen = len(key)
            j = 0
            for k in range(keylen):
                aresult = 'actualresult' + key[k]
                eresult = 'expectresult' + key[k]
                if eval(aresult) == eval(eresult):
                    #预期结果和实际结果一致
                    j = j + 1
            if j == keylen:
                #测试数据执行通过
                nok = nok + 1
                writeexcel.set_cell(i, 8, 'SUCCESS')
            else:
                # 测试数据执行失败,并将实际结果写入excel
                ner = ner + 1
                writeexcel.set_cell(i, 8, 'FAILURE')
                writeexcel.set_cell(i, 7, str(actualresult))
                print('第', i + 1, '行用例执行失败:预期结果是', expectresult, '实际结果是', actualresult)
            # 保存测试报告
            writeexcel.save_excel('testreport', '.xls')
            print('测试数据中总共', nok, '条用例执行通过', ner, '条用例执行失败')
 
    #释放资源
    def tearDown(self):
        pass
 
if __name__ == '__main__':
    #构造测试集合
    suite = unittest.TestSuite()
    suite.addTest(testcase('test_case'))
    #创建html文件
    filename = ReadConfig().get_config('DATABASE', 'report_address') + 'testreport.html'
    fb = open(filename,"wb")
    #执行测试并生成html测试报告
    runner = HTMLTestRunner.HTMLTestRunner(stream = fb,description = '针对接口的描述信息',title = '某某的自动化测试报告')
    runner.run(suite)
    #关闭文件
    fb.close()
 

最后,生成的html报告

最后:【可能给你带来帮助的教程】

软件测试最新自学教程

这一些资料,对做【软件测试】的朋友而言应该是较为完整了,这类学习资料也陪伴我走过了最艰难的路程,希望也可以帮助到你!万事要尽早,尤其是技术行业,一定要提升技术功底。

相关推荐

点过的网页会变色?没错,这玩意把你的浏览记录漏光了

提起隐私泄露这事儿,托尼其实早就麻了。。。平时网购、换手机号、注册各种账号之类的都会咔咔泄露,根本就防不住。但托尼真是没想到,浏览器里会有一个看起来完全人畜无害的功能,也在偷偷泄露我们的个人隐私,而且...

Axure教程:高保真数据可视化原型

本文将介绍如何制作Axure高保真数据可视化原型,供大家参考和学习。高保真数据可视化原型设计,称得上是Axure高阶水平。数据可视化在原型设计中是一个重要的分支,但是对于Axure使用者具有一定要求。...

Flutter web开发中禁用浏览器后退按钮

路由采用的go-router路由框架:finalrootNavigatorKey=GlobalKey<NavigatorState>();finalGoRouterrouter...

jQuery 控制属性和样式

标记的属性each()遍历元素:each(callback)方法主要用于对选择器进行遍历,它接受一个函数为参数,该函数接受一个参数,指代元素的序号。对于标记的属性而言,可以利用each()方法配合th...

微信小程序入门教程之二:页面样式

这个系列的上一篇教程,教大家写了一个最简单的Helloworld微信小程序。但是,那只是一个裸页面,并不好看。今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的页...

如何在Windows11的任务栏中禁用和删除天气小部件图标?

微软该公司已在Windows11的任务栏中添加了一个天气小部件图标,作为小部件的入口点。这个功能与之前Win10上的新闻与资讯功能相同,但是有的用户不喜欢想要关闭,不知道如何操作,下面小编为大家带来...

CSS伪类选择器大全:提升网页交互与样式的神奇工具

CSS伪类选择器是前端开发中不可或缺的强大工具,它们允许我们根据元素的状态、位置或用户行为动态地应用样式。本文将全面介绍常用的伪类选择器,并通过代码示例展示其实际应用场景。一、基础交互伪类1.超链接...

7个Axure使用小技巧

编辑导读:对于Axure原型工具,很少有产品经过系统学习,一般都是直接上手,边摸索边学习,这直接导致很多快捷操作被忽视。笔者在日常工作中总结出以下小技巧,希望对各位有帮助。之前整理了2期Axure的...

JavaScript黑暗技巧:禁止浏览器点击“后退”按钮

浏览网页时,当从A页面点击跳转到B页面后,一般情况下,可以点击浏览器上的“后退”按钮返回A页面。如果进入B页面后,B页面想让访问者留下,禁止返回,是否可以实现呢?这简直是要控制浏览器的行为,虽然有些邪...

对齐PyTorch,一文详解OneFlow的DataLoader实现

撰文|赵露阳在最新的OneFlowv0.5.0版本中,我们增加了许多新特性,比如:新增动态图特性:OneFlow默认以动态图模式(eager)运行,与静态图模式(graph)相比,更容易搭建网...

Python计算机视觉编程 第一章 基本的图像操作和处理

以下是使用Python进行基本图像操作和处理的示例代码:使用PIL库加载图像:fromPILimportImageimage=Image.open("image.jpg"...

PyTorch 深度学习实战(31):可解释性AI与特征可视化

在上一篇文章中,我们探讨了模型压缩与量化部署技术。本文将深入可解释性AI与特征可视化领域,揭示深度学习模型的决策机制,帮助开发者理解和解释模型的内部工作原理。一、可解释性AI基础1.核心概念特征重要...

学习编程第177天 python编程 富文本框text控件的使用

今天学习的是刘金玉老师零基础Python教程第72期,主要内容是python编程富文本框text控件。一、知识点1.tag_config方法:利用某个别名作为标签,具体的对应标签的属性功能配置在后面参...

用Python讓電腦攝像頭實現掃二維碼

importsys#系統模組,用來存取命令列參數與系統功能importcv2#OpenCV,處理影像與相機操作importnumpyasnp#Numpy,用來處理數值與...

使用Transformer来做物体检测

作者:JacobBriones编译:ronghuaiyang导读这是一个Facebook的目标检测Transformer(DETR)的完整指南。介绍DEtectionTRansformer(D...