- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章基于Python的接口自动化读写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读写的目的.
1.使用pip安装 。
pip install xlrdpip install xlwtpip install xlutils
2.在PyCharm中安装 。
直接检索需要安装的模块名称即可,如xlrd
新建一个excel文件,文件名称:excel_test.xlsx,文件编辑有两个sheet表,内容如下:
sheet1:
sheet2:
(1)打开excel文件,获取excel的sheet名 。
编辑如下代码:
import xlrdfile = xlrd.open_workbook("excel_test.xlsx")all_sheet = file.sheet_names() # 获取所有的工作簿名sheet_name1 = file.sheet_names()[0] # 通过sheet下标获取,第一个sheet下标为0sheet_name2 = file.sheet_by_index(0).name # 通过sheet索引获取sheet名print(all_sheet)print(sheet_name1)print(sheet_name2)-----------------------------------------# 返回结果['员工信息表', 'api测试用例']员工信息表员工信息表
(2)获取sheet工作表页的对象 。
代码示例:
import xlrdfile = 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 xlrdfile = 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)-------------------------------# 返回结果65['王五', '男', 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 xlrdfrom datetime import datefile = 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文件写入数据,简单示例如下:
import xlwt workbook = xlwt.Workbook(encoding = 'utf-8') # 创建工作簿sheet = workbook.add_sheet('api_test') # 添加一个sheetdata = sheet.write(0,0,'test') # 向第一行第一列写入数据:testworkbook.save('book.xlsx') # 保存到book.xlsx中
运行完成后会在该py文件的同级目录下生成一个book.xlsx的excel文件,并新增了api_test的sheet表名,第一行第一列写入数据:test 。
向excel写入数据时,可以设置单元格长宽、单元格合并、写入时间格式数据以及添加超链接等 。
代码示例:
import xlwtimport datetimeworkbook = xlwt.Workbook(encoding = 'utf-8') # 创建工作簿sheet = workbook.add_sheet('api_test') # 添加一个sheetdata = sheet.write(4,0,'test') sheet.col(0).width = 5000 # 设置单元格宽度 style = xlwt.XFStyle() # 初始化表格样式style.num_format_str = 'M/D/YY' # 设置时间格式,如:M/D/YYsheet.write(5, 1, datetime.datetime.now(), style) # 写入时间格式数据 # 合并多列和和并多行# 表示合并的行数是:按行索引,从0行到第0行,按列索引从0列到第3列,合并后并写入数据:test1sheet.write_merge(0, 0, 0, 3, 'test1')# 表示合并的行数是:按行索引,从1行到第2行,按列索引从0列到第3列,合并后并写入数据:test2sheet.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效果如下:
(1)拷贝excel表格 。
xlutils模块下的copy可以复制拷贝excel文件,代码示例:
import xlrdfrom xlutils.copy import copyexcel_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 xlrdfrom xlutils.copy import copyexcel_file = xlrd.open_workbook("book.xlsx")new_file = copy(excel_file)sheet = new_file.get_sheet(0) # 获取表格的第一个sheetsheet.write(0,1,"测试") # 第一行第二列写入:测试sheet.write(1,1,"测试1") # 第二行第二列写入:测试1new_file.save("book.xlsx")
运行后book.xlsx表会修改更新 。
通过上面介绍,基本具备使用xlrd、xlwt、xlutils模块进行excel文件数据读取和向excel文件中写入数据,在进行接口测试时,我们说到需要:测试数据和测试脚本分离,后续的接口测试用例数据,我们统一写入excel表格中,然后通过操作excel来读取测试数据并将测试结果回填到excel中。因此,咱们需要对向excel读取数据和向excel写入数据的操作进行封装.
我们操作上面的api测试用例这个sheet,封装读取excel数据的类,代码示例:
from xlrd import open_workbookclass 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 copyfrom 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操作的封装,后续接口测试数据的读取和写入就依靠这两个类了.
到此这篇关于基于Python的接口自动化读写excel文件的文章就介绍到这了,更多相关Python接口自动化内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/tdp0108/p/14239763.html 。
最后此篇关于基于Python的接口自动化读写excel文件的方法的文章就讲到这里了,如果你想了解更多关于基于Python的接口自动化读写excel文件的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!