Python的接口自动化-读写excel文件

news2024/11/26 0:55:49

目录

引言

一、xlrd、xlwt以及xlutils安装

二、xlrd操作excel文件的数据读取

三、xlwt向excel文件写入数据

四、xlutils操作excel文件

五、封装操作excel读和写的类


引言

        使用python进行接口测试时常常需要接口用例测试数据、断言接口功能、验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来很冗余和难以清晰的阅读以及维护,试想如果所有的接口测试数据都写在代码中,接口参数或者测试数据需要修改,那不得每个代码文件都要一一改动?

因此,这种不高效的模式不是我们想要的。所以,在自动化测试中就有个重要的思想:测试数据和测试脚本分离,也就是测试脚本只有一份,其中需要输入数据的地方会用变量来代替,然后把测试输入数据单独放在一个文件中,这个存放测试输入数据的文件,通常是表格的形式或者其他格式文件,如excel文件、json文件、xml文件、txt文本文件等等。

在python进行接口自动化测试时,为了方便管理和存储测试用例数据,一般将测试数据编写存储在excel文件中,测试脚本通过读取excel文件来实现测试数据加载,并运行得出测试用例数据执行的结果,并回写测试结果到excel文件中,这样就实现了测试脚本和数据的分离。

而python操作excel文件的读写,这里需要安装并引入第三方模块:xlrd和xlwt以及xlutils,xlrd为读取excel模块,xlwt为向excel写数据的模块,xlutils可以复制excel并修改excel中的数据。下面就具体介绍xlrd和xlwt操作excel文件提供的通用方法和技巧,以及xlutils如何复制和修改excel,达到操作excel读写的目的。

一、xlrd、xlwt以及xlutils安装

1.使用pip安装

pip install xlrd

pip install xlwt

pip install xlutils

2.在PyCharm中安装

 直接检索需要安装的模块名称即可,如xlrd:

二、xlrd操作excel文件的数据读取

新建一个excel文件,文件名称:excel_test.xlsx,文件编辑有两个sheet表,内容如下:

sheet1:

 sheet2:

 (1)打开excel文件,获取excel的sheet名

编辑如下代码:

import xlrd

file = xlrd.open_workbook("excel_test.xlsx")

all_sheet = file.sheet_names()  # 获取所有的工作簿名

sheet_name1 = file.sheet_names()[0]  # 通过sheet下标获取,第一个sheet下标为0

sheet_name2 = file.sheet_by_index(0).name # 通过sheet索引获取sheet名

print(all_sheet)

print(sheet_name1)

print(sheet_name2)

-----------------------------------------

# 返回结果

['员工信息表', 'api测试用例']

员工信息表

员工信息表

 (2)获取sheet工作表页的对象

代码示例:

import xlrd

file = xlrd.open_workbook("excel_test.xlsx")

sheet_name1 = file.sheet_names()[0]

sheet1_obj = file.sheet_by_name(sheet_name1)  # 通过sheet名获取sheet对象

sheet2_obj = file.sheet_by_index(1) # 通过sheet索引获取sheet对象

print(sheet1_obj)

print(sheet2_obj)

------------------------------------

# 返回结果

<xlrd.sheet.Sheet object at 0x0000000002AA09B0>

<xlrd.sheet.Sheet object at 0x0000000002AA0978>

(3)获取sheet工作表的行、列数,整行、整列数据,具体的单元格数据

代码示例:

import xlrd

file = xlrd.open_workbook("excel_test.xlsx")

sheet = file.sheet_by_index(0) # 通过sheet索引获取sheet对象

nrows = sheet.nrows    # 获取行数

ncols = sheet.ncols    # 获取列数

nrows_data = sheet.row_values(1)   # 获取第二行数据,返回的是列表

ncols_data = sheet.col_values(0)   # 获取第一列数据,返回的是列表

cell = sheet.cell(1,2)             # 获取单元格数据,如第二行,第三列数据

print(nrows)

print(ncols)

print(nrows_data)

print(ncols_data)

print(cell)

-------------------------------

# 返回结果

6

5

['王五', '男', 32883.0, 'java开发工程师', 233.0]

['姓名', '王五', '李四', '张三', '小红', '小明']

xldate:32883.0      # 这里日期数据直接返回成浮点数了

 常见读取excel不同数据类型的返回问题,如读取日期格式的数据

一般使用sheet.cell(rowx,colx)方法获取单元格数据,单元格数据类型判断可以使用如下代码:

print(sheet.cell(1,2).ctype)

------------

# 返回日期数据的结果

3

注:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

读取单元格日期数据为浮点数的处理方式:

代码如下:

import xlrd

from datetime import date

file = xlrd.open_workbook("excel_test.xlsx")

sheet = file.sheet_by_index(0) # 通过sheet索引获取sheet对象

nrows_data = sheet.row_values(1)   # 获取第二行数据,返回的是列表

ncols_data = sheet.col_values(0)   # 获取第一列数据,返回的是列表

cell = sheet.cell(1,2)             # 获取单元格数据,如第二行,第三列数据,返回的是浮点数

data_value = xlrd.xldate_as_tuple(sheet.cell_value(1,2) ,file.datemode)  # xldate_as_tuple()方法得到日期数据年月日时分秒的值并返回为元组

datatime2 = date(*data_value[:3]).strftime('%Y/%m/%d') # 截取元组中的前三位,即年月日的值传给data,并进行时间格式化



print(cell)

print(data_value)

print(datatime2)



-----------------------

# 返回结果

xldate:32883.0

(1990, 1, 10, 0, 0, 0)

1990/01/10

因此在读取excel单元格数据,如遇到是日期格式的数据,可以加上如下代码判断并处理:

if (sheet.cell(row,col).ctype == 3):

  date_value = xlrd.xldate_as_tuple(sheet.cell_value(row,col),file.datemode)

  date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')

三、xlwt向excel文件写入数据

 xlwt一般用于向excel文件写入数据,简单示例如下:

import xlwt



workbook = xlwt.Workbook(encoding = 'utf-8')  # 创建工作簿

sheet = workbook.add_sheet('api_test')       # 添加一个sheet

data = sheet.write(0,0,'test')                # 向第一行第一列写入数据:test

workbook.save('book.xlsx')                   # 保存到book.xlsx中

 运行完成后会在该py文件的同级目录下生成一个book.xlsx的excel文件,并新增了api_test的sheet表名,第一行第一列写入数据:test

 向excel写入数据时,可以设置单元格长宽、单元格合并、写入时间格式数据以及添加超链接等

代码示例:

import xlwt

import datetime

workbook = xlwt.Workbook(encoding = 'utf-8')  # 创建工作簿

sheet = workbook.add_sheet('api_test')       # 添加一个sheet

data = sheet.write(4,0,'test')



sheet.col(0).width = 5000                      # 设置单元格宽度



style = xlwt.XFStyle()                         # 初始化表格样式

style.num_format_str = 'M/D/YY'               # 设置时间格式,如:M/D/YY

sheet.write(5, 1, datetime.datetime.now(), style)      # 写入时间格式数据



# 合并多列和和并多行

# 表示合并的行数是:按行索引,从0行到第0行,按列索引从0列到第3列,合并后并写入数据:test1

sheet.write_merge(0, 0, 0, 3, 'test1')

# 表示合并的行数是:按行索引,从1行到第2行,按列索引从0列到第3列,合并后并写入数据:test2

sheet.write_merge(1, 2, 0, 3, 'test2')



# 向单元格添加超链接

sheet.write(6, 0, xlwt.Formula('HYPERLINK("https://www.baidu.com/";"baidu")'))



workbook.save('book.xlsx')                   # 保存到book.xlsx中

 运行后输出excel效果如下:

四、xlutils操作excel文件

 (1)拷贝excel表格

xlutils模块下的copy可以复制拷贝excel文件,代码示例:

import xlrd

from xlutils.copy import copy

excel_file = xlrd.open_workbook("book.xlsx")

new_file = copy(excel_file)   # 拷贝文件对象

new_file.save("book1.xlsx")   # 保存为excel文件

 运行以上代码会在同级目录下生成一个book1.xlsx的excel文件,该文件和book.xlsx一样,只是文件名称不一样而已,也就是复制excel文件了

(2)修改excel文件内容

除了copy为其他excel文件外,也可以直接copy文件修改后,保存为同名的文件,那修改的内容将直接覆盖原excel文件,达到修改的目的

示例:

import xlrd

from xlutils.copy import copy

excel_file = xlrd.open_workbook("book.xlsx")

new_file = copy(excel_file)

sheet = new_file.get_sheet(0) # 获取表格的第一个sheet

sheet.write(0,1,"测试")      # 第一行第二列写入:测试

sheet.write(1,1,"测试1")     # 第二行第二列写入:测试1

new_file.save("book.xlsx")

 运行后book.xlsx表会修改更新

五、封装操作excel读和写的类

通过上面介绍,基本具备使用xlrd、xlwt、xlutils模块进行excel文件数据读取和向excel文件中写入数据,在进行接口测试时,我们说到需要:测试数据和测试脚本分离,后续的接口测试用例数据,我们统一写入excel表格中,然后通过操作excel来读取测试数据并将测试结果回填到excel中。因此,咱们需要对向excel读取数据和向excel写入数据的操作进行封装。

我们操作上面的api测试用例这个sheet,封装读取excel数据的类,代码示例:

from xlrd import open_workbook

class Readexcel():



    def excel_data_list(self, filename, sheetname):

        '''

        :param filename: excel文件名称

        :param sheetname: excel中表格sheet名称

        :return: data_list

        '''

        data_list = []

        wb = open_workbook(filename)  # 打开excel

        sh = wb.sheet_by_name(sheetname)  # 定位工作表

        header = sh.row_values(0)   # 获取标题行的数据

        for i in range(1, sh.nrows):   # 跳过标题行,从第二行开始获取数据

            col_datas = dict(zip(header, sh.row_values(i)))   # 将每一行的数据,组装成字典

            data_list.append(col_datas)   # 将字典添加到列表中 ,列表嵌套字典,每个元素就是一个字典

        return data_list



if __name__ == '__main__':

    Readexcel()

 上面代码封装了读取excel数据的类,将每一行数据读取出来组装成字典并添加到列表中

实例化运行:

    data_list = Readexcel().excel_data_list('excel_test.xlsx','api测试用例')

    print(data_list)

-----------------------

# 返回结果

[

 {'module': '视频安防', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/recep/tv/list', 'id': 1.0, 'params': '{ "queryMsg":"","regionCode":"","devtypeCode":"","online":"","offset":"","limit":1,"type":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '分页查询视频安防设备列表', 'files': ''},

 {'module': '平台管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/appsys/info', 'id': 2.0, 'params': '', 'method': 'post', 'actual_res': '', 'data': '{"appName": "hahh","appId": "34434343","appUrl": "http://12306.com","appCode": "89","remark":""}', 'expect_res': '{"code": 200,"errMsg": ""}', 'test_res': '', 'case_name': '应用管理-单个应用系统添加', 'files': ''},

 {'module': '平台管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/appsys/info/upappid/89', 'id': 3.0, 'params': '', 'method': 'put', 'actual_res': '', 'data': '{"appId": "3232327676888"}', 'expect_res': '{"code": 200,"errMsg": ""}', 'test_res': '', 'case_name': '应用管理-修改应用appId', 'files': ''},

 {'module': '平台管理', 'url': 'http://imp-t.tfgreenroad.com:18092/console_api/manage/devtype/list', 'id': 4.0, 'params': '{ "queryMsg":"15002","offset":"","limit":""}', 'method': 'get', 'actual_res': '', 'data': '', 'expect_res': '', 'test_res': '', 'case_name': '设备分类-分页获取设备类型', 'files': ''}

]

 封装向excel写入数据的类,代码示例:

from xlutils.copy import copy

from xlrd import open_workbook



class Write_excel():

    def write_result(self, filename, row, col1,col2,actual_res, test_res,sheet_name):

        '''

        :param filename: 文件名

        :param row: 要写回的行

        :param col1: 要写回的列

        :param col2: 要写回的列

        :param actual_res: 实际结果

        :param test_res: 测试结果 :pass/failed

        :param sheet_name:指定的sheet表索引

        :return:

        '''

        old_workbook = open_workbook(filename)

        # 将已存在的excel拷贝进新的excel

        new_workbook = copy(old_workbook)

        # 获取sheet

        new_worksheet = new_workbook.get_sheet(sheet_name)  # 第n个sheet,0表示第一个sheet

        # 写入数据

        new_worksheet.write(row, col1, actual_res)

        new_worksheet.write(row, col2, test_res)

        # 保存

        new_workbook.save("book.xlsx")



if __name__ == '__main__':

    Write_excel()

  这样我们就完成了读写excel操作的封装,后续接口测试数据的读取和写入就依靠这两个类了。


最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)

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

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

相关文章

Mysql升级8.0后日期类型兼容性问题

背景 最近对原有项目数据库进行升级&#xff0c;从MySQL 5.7 升级到8.0&#xff0c;因此项目种的驱动程序也要做相应升级。 问题 一、 升级后报&#xff1a;java.time.LocalDateTime cannot be cast to java.util.Date 该问题是因为代码中使用Map类型获取查询返回值&#xf…

lightdb检测不兼容工具CheckUnsupportOracle使用说明

oracle有很多特性在lightdb无法使用&#xff0c;使用该工具可以即时扫描某个在线数据库或本地文件夹中有哪些不兼容特性&#xff0c;-a -x对oracle不兼容特性有所区别&#xff0c;扫描范围可参考后续表格。 0、使用限制 默认扫描存储过程&#xff0c;函数及包默认仅支持oracl…

19JS10——预解析

文章目录 一、预解析二、变量预解析和函数预解析三、预解析案例1、案例1&#xff1a;结果是几&#xff1f;2、案例2&#xff1a;结果是几&#xff1f;3、案例3&#xff1a;结果是几&#xff1f;4、案例4&#xff1a;结果是几&#xff1f; 目标&#xff1a; 1、预解析 2、变量预…

电脑连上wifi但显示无网解决方案分享,轻松搞定电脑上网问题

有的时候我们会遇到这样的问题&#xff1a;电脑明明连接了网络但仍不能上网&#xff0c;并且出现错误提示“WiFi已连接但没有互联网”。遇到这种情况&#xff0c;我们可以先使用另一台设备访问网络&#xff0c;看看你能否正常上网。如果也不能上网&#xff0c;可以尝试重新启动…

七牛云存储开启referer防盗链后,微信小程序访问提示403

点击七牛云存储存储桶绑定的加速域名 配置站点域名和微信小程序域名 是否允许空Referer一定要打开&#xff0c;否则小程序上的视频或图片访问时将提示403

# 如何在Git上更改本地分支名称和远程分支名称

有时候我们需要修改git分支名称&#xff0c;例如不合理的分支名称。本篇文章分享了如何轻松地修改Git本地分支名称和修改远程分支名称。 在Git中&#xff0c;通常使用分支来使开发与您的主要工作流程分开。在软件工程团队中&#xff0c;通常要实施特定的工作流程。例如&#x…

[C语言实现]数据结构之《关于我转生成队列这档事》

&#x1f970;作者: FlashRider &#x1f30f;专栏: 数据结构 &#x1f356;知识概要&#xff1a;详解队列的概念、顺序队列和链式队列的优点和缺点&#xff0c;以及代码实现。 目录 什么是队列&#xff1f; 选择什么结构来实现队列&#xff1f; 链式队列的实现 队列的结构…

在UE中使用Stencil功能

Stencil是指利用深度buffer的后8位数据进行bit mask信息的绘制&#xff0c;从而制作类似角色mask遮罩等效果&#xff0c;下面就在UE中进行制作。 1.首先在Project Settings项目设置中开启stencil&#xff0c;搜索stencil关键字在Custom Depth Stencil Pass选项中设置为Enabled…

PNAS:勘探地球物理学论文

阅读 《Sensing prior constraints in deep neural networks for solving exploration geophysical problems dendrimers》 题目译为《深度神经网络中用于解决勘探地球物理问题的感知先验约束》 研究意义 该研究提出三种可能的策略&#xff0c;以有效地讲地质和/或地球物理约…

面试官再问分布式事务,三天吃透这份至尊级学习笔记怼他

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说&#xff0c;就是一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;且属于不同的应用&#xff0c;分布式…

ABAP 新语法--Open SQL(草稿)

1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值&#xff0c;字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识&#xff0c;常量空字符串123 AS fla…

QCon高分演讲:火山引擎容器技术在边缘计算场景下的应用实践与探索

近日&#xff0c;火山引擎边缘云原生团队的同学在QCon全球软件开发大会上分享了火山引擎容器技术在边缘计算场景下的应用实践与探索&#xff0c;并在一众AIGC、LLM等当下热门议题中脱颖而出&#xff0c;入选观众满意度投票中“叫好又叫座议题Top5”。 以下是演讲全文&#xff1…

论文阅读 Interpretable Unified Language Checking

本文提出了一种新的方法来解决多种自然语言处理任务中的问题&#xff0c;包括公平性检查、事实检查、虚假新闻检测和对抗攻击检测等。该方法基于大型语言模型和少量人类标注的提示信息&#xff0c;通过在模型中引入相应的提示&#xff0c;来提高模型的性能和可解释性。该论文的…

数据库索引及优化

索引 1.索引简介 1.1 概念 MySQL官方对索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。索引的本质&#xff1a;索引是数据结构。 注&#xff1a;在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&…

第二章---感知机

&#x1f31e;欢迎来到深度学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

centos各个版本jenkins部署

目录 官网安装方法 安装java&#xff0c;**注意java版本&#xff0c;新版本jenkins只支持jdk11及以上 安装jenkins Jenkins启动失败的七个问题 jenkins 部署脚本 Nginx转发jenkins服务 官网安装方法 Redhat Jenkins Packages (jenkins-ci.org)https://mirrors.jenkins-c…

微信朋友圈怎么定时发送?微信朋友圈定时发送有什么优势?

刷朋友圈已经成为大部分人日常中不可缺少的一件事&#xff0c;同时也是企业用来触达客户的重要渠道。下面一起来了解一下微信朋友圈定时发送的优势有哪些&#xff0c;还有怎么定时发朋友圈吧。 定时发朋友圈的优势有哪些&#xff1f; 1、让企业能够更好地管理自己的宣传信息 …

HttpRunner 接口自动化测试框架实战,打造高效测试流程

简介 2018年python开发者大会上&#xff0c;了解到HttpRuuner开源自动化测试框架&#xff0c;采用YAML/JSON格式管理用例&#xff0c;能录制和转换生成用例功能&#xff0c;充分做到用例与测试代码分离&#xff0c;相比excel维护测试场景数据更加简洁。在此&#xff0c;利用业…

Tree of Thoughts: Deliberate Problem Solving with Large Language Models

思维树&#xff1a;用大模型深思熟虑的解决问题 Tree of Thoughts: Deliberate Problem Solving with Large Language Models概述&#xff1a;核心思想&#xff1a;背景&#xff1a;IO promptingCoTCoT-SC 算法流程&#xff1a;主要实验对象&#xff1a;24点游戏创意写作填字游…

Linux5.3 Haproxy搭建Web群集

文章目录 计算机系统5G云计算第四章 LINUX Haproxy搭建Web群集一、Keepalived 概述1. HAProxy的主要特性2.常见的 Web 集群调度器3.HAProxy负载均衡策略4.LVS、Nginx、HAproxy的区别 二、Haproxy搭建 Web 群集 Keepalived部署高可用集群1.haproxy 服务器部署&#xff0c;配置负…