如何用Python3+requests+unittest实现接口自动化测试实战

一、Requests介绍

首先让我们来看 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)

框架详解不在此赘述,requests可参考

unittest参考点击查看

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

我们的结构是这样的

 

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报告

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch文档分析

ElasticSearch文档分析 包含下面的过程: 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里: 字符过滤器 首先&a…

乐优商城(三)品牌管理

1. 品牌的新增 1.1 url 异步请求 点击品牌管理下的新增品牌,填写品牌信息后提交 2.打开浏览器控制台 由此可以得知: 请求方式:POST请求路径:/item/brand请求参数:{name: “测试品牌”, image: “”, cids: “76,32…

云端生成式 AI – 基于 Amazon EKS 的 Stable Diffusion 图像生成方案

Stable Diffusion 是当下生成式 AI 领域最受欢迎的开源多模态语言-图像模型,由于其易用的接口和良好的使用体验,受到了开源社区和广大设计行业从业者的追捧。Stable Diffusion 模型版本正在快速迭代,并带动了各行各业的生产力变革。目前市场上…

SAP 40策略测试及简介

相信很多很多的行业中都会用到40策略按库存生产,接下来我们将详细的测试40策略 1、首先准备好成品物料AB2。 2、创建BOM—cs01 3、创建主配方C202 ,如果是离散制造的话就是创建工艺路线CA01 4、创建生产版本C223 5、同样的AB2物料增加库存20KG。 6、创建计划独立需求MD…

微信智能机器人开发-基于E云管家,实现强大的个微管理

本文介绍了如何利用E云管家开发一个功能丰富的微信智能机器人。E云管家是一个开发协议,为微信机器人提供了强大的功能支持,包括关键字回复、自动通过好友和自动发朋友圈等特性。我们将通过一个简单的示例演示如何在E云管家下实现这些功能,并附…

EMERSON艾默生变频器维修M600/M701/M702

艾默生变频器维修常见系列: EV1000 系列:体积小,操作简便,适用于塑料机械、纺织机械、烟草机械、陶瓷机械、制药机械食品机械、印刷机械、包装机械、空调等专用设备配套。 EV2000 系列:功率范围广,功能更…

2020年五一杯数学建模B题基于系统性风险角度的基金资产配置策略分析解题全过程文档及程序

2020年五一杯数学建模 B题 基于系统性风险角度的基金资产配置策略分析 原题再现 近年来,随着改革开放程度的不断提高,我国经济运行中的各种风险逐渐暴露并集中传导和体现于金融领域。党的“十九大”报告提出“守住不发生系统性金融风险的底线”要求&am…

企业组建客服中心,需要考虑哪些问题?

随着市场竞争的加剧,企业越来越注重客户服务。因此,组建一个专业的客服中心已成为企业的一个重要战略举措。然而,这个任务不仅需要考虑技术和人员方面的问题,还需要考虑许多其他的因素。在本文中,我们将探讨企业在组建…

使用双动态令牌混合器学习全局和局部动态以进行视觉识别

TransXNet: Learning Both Global and Local Dynamics with a Dual Dynamic Token Mixer for Visual Recognition 1、问题与解决2、引言3、方法3.1 双动态令牌混合器(D- Mixer)3.2 IDConv(Input-dependent Depthwise Convolution)3.3 Overlapping Spatial Reduction Attention …

Java 身份证号校验,根据身份证号识别出生地

Java 身份证号校验: import org.apache.commons.lang.StringUtils;import java.util.Calendar; import java.util.Collections; import java.util.HashMap; import java.util.Map;/*** desc 身份证工具类* auth llp* date 2022/7/7 16:13*/ public class IdCardNum…

神仙打架!腾讯云阿里云谁更棋高一着?

现在,腾讯云和阿里云都在打价格战,推出了一系列的优惠政策。其中,腾讯云服务器只需要88元,而阿里云服务器也只需要99元。这么便宜的价格,是不是让你心动不已呢? 腾讯云的88元服务器:https://te…

MySQL优化方案

Mysql优化 一、连接配置优化1.服务端配置2.客户端优化 二、架构优化1.使用缓存2.做读写分离(集群、主从复制)3.分库分表3.1.垂直分库3.2.垂直分表3.3.水平分表3.4.水平分库 4.消息队列削峰 三、优化器——SQL分析与优化1.慢查询优化1.1.配置慢查询日志1.…

第三方支付支付宝的信息安全分析

随着信息技术的进步,网络结算方式也在迅速发展。网上结算虽然便捷快速,但是如果没有保障的平台或者法律的支持,双方在没有约束的情况下,就会导致拖延、折扣或者拒付等许多经济事件的发生,由此第三方支付就随之产生。第…

嵌入式开发:ST-LINK V2.1仿真器,Type-C接口

标题ST-LINK V2.1仿真器,Type-C接口 之前做的版本虽然也是V2.1的,但使用的接口是USB的Micro形式,不支持正反插,也不兼容现在通用的手机数据线,出差的时候又要多带一条线。 现在终于把我的ST-LINK的接口改了一下 如下…

oracle11G在linux环境下的卸载操作

1.使用SQL*PLUS停止数据库 [oracleOracleTest oracle]$ sqlplus / as sysdba SQL> shutdown [immediate] SQL> exit2.停止Listener [oracleOracleTest oracle]$ lsnrctl stop3.停止HTTP服务 [rootOracleTest /root]# service httpd stop4.用su或者重新登录到root(如想…

『吴秋霖赠书活动 | 第四期』《Spring Boot微服务实战》

文章目录 1. 写在前面2. Spring Boot介绍3. Spring Boot实战4. Spring Boot主要内容概览 1. 写在前面 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【…

视频剪辑方法:为视频剪辑添加亮点,如何制作精美的滚动字幕

在视频剪辑中,滚动字幕是一个重要的元素,它可以为视频增添视觉吸引力,增强观看体验。滚动字幕的长度和速度也是非常重要的因素。如果滚动字幕太长,会让人感到拖沓;如果滚动字幕太短,会让人感到匆忙。因此&a…

安装dock打包前端项目遇到的一些错误

1docker安装报错 2 docker安装报错 运行 wsl --list报错 wsl --list 适用于 Linux 的 Windows 子系统没有已安装的分发版。 可以通过访问 Microsoft Store 来安装分发版解决方法 如果执行 wsl --list 命令报告适用于 Linux 的 Windows 子系统没有已安装的分发版,…

Git的安装,简介以及常用命令【超详细】

目录 一. Git简介 分布式特点 优缺点 Git 与 SVN 区别 二. Git安装 三. Git常用命令 四. Git的文件状态 1.文件状态 2.工作区域 一. Git简介 Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds…

AntDB-M高性能设计之hash索引动态rehash

AntDB-M支持hash索引、btree索引等索引类型,hash索引以hash表的方式实现,一个简单的hash表示意图如图1所示。hash桶下的元素节点为单向或者双向链表,数据行上某一个或者某几个字段组成索引,通过hash函数对索引字段的值进行运算&am…