一、前言
最近在工作项目中实现了接口的自动化测试脚本,使用的是Python+requests库,利用requests中的session对象,携带登录后的用户信息发送接口请求,再将接口的状态和返回报文等信息组装成测试结果,写入excel表格。
因为涉及到的接口比较多,在把测试结果写入excel表格的时候,就得需要考虑写入的效率。通过网上的一番查询和线下的请教,利用xlwt/xlrd和openpyxl这两种第三方库,实现了对表格的数据写入操作代码,特记录总结在此;另一方面,也是为了日后再有需要,可直接使用对应的代码。
二、执行环境
正好手里有两台不同CPU的电脑,索性就在两台电脑上都跑一遍,在同平台下比较第三方库之间的代码执行效率。
| 配置项 | 笔记本 | 台式机 |
|---|---|---|
| 系统 | Windows10 | Windows10 |
| CPU | R7-4800U 8核16线程 | i5-8400 6核6线程 |
| 内存 | 16G | 16G |
| 主硬盘 | 512G三星SSD | 256G三星SSD |
三、参考代码
3.1 xlwt/xlrd库
# -*- coding: UTF-8 -*-
"""=================================================
@Author :Fantasy_Boyce
@Date :2020/9/14 21:33
@Desc :Excel表格处理类
=================================================="""
import xlwt
import xlrd
import os
import time
from xlutils.copy import copy
var code = "064695cf-dce8-4008-8748-4ce45b4e3322"
class ExcelHandle:
def __init__(self):
# 初始化保存的路径和文件名,此处以当前时间命名,如有其他需求,可自行更改
filename = '{}.csv'.format(time.strftime('%Y%m%d%H%M%S'))
self.path = os.path.join(os.getcwd(), filename)
# 初始化表格的表头字段
self.__init_title = ['序号', '时间', 'URL地址', '第一个数', '第二个数', '公式', '备注']
self.__init_templates()
def __init_templates(self):
# 初始化文件,生成一个仅含有表头的表格
try:
if os.path.exists(self.path):
os.remove(self.path)
self.__init_templates()
else:
# 新建一个工作表对象
workbook = xlwt.Workbook(self.path)
# 创建sheet页
sheet = workbook.add_sheet('测试数据页')
# 循环之前定义的表头,从第1行第1列开始,依次写入数据
for i in range(len(self.__init_title)):
sheet.write(0, i, self.__init_title[i])
workbook.save(self.path)
except Exception as e:
print(e)
def write_content(self, content):
try:
# 打开表格
workbook = xlrd.open_workbook(self.path)
# 获取表格中所有的sheets页,列表类型
sheets_list = workbook.sheet_names()
# 获取第1张sheet页,序号从0开始,即最左边的sheet页。
worksheet = workbook.sheet_by_name(sheets_list[0])
# 获取当前sheet页中已有数据的行数
row_old = worksheet.nrows
new_workbook = copy(workbook)
new_worksheet = new_workbook.get_sheet(0)
# 遍历传入的content内容,写入表格中
for j in range(len(self.__init_title)):
new_worksheet.write(row_old, j, content[j])
new_workbook.save(self.path)
except Exception as e:
print(e)
3.2 openpyxl库
# -*- coding: UTF-8 -*-
"""=================================================
@Author :Fantasy_Boyce
@Date :2020/9/14 22:11
@Desc :
=================================================="""
import os
import time
import openpyxl
class ExcelHandle:
def __init__(self):
# 初始化保存的路径和文件名,此处以当前时间命名,如有其他需求,可自行更改
filename = '{}.xlsx'.format(time.strftime('%Y%m%d%H%M%S'))
self.path = os.path.join(os.getcwd(), filename)
# 初始化表格的表头字段
self.__init_title = ['序号', '时间', 'URL地址', '第一个数', '第二个数', '公式', '备注']
self.__init_templates()
def __init_templates(self):
# 初始化文件,生成一个仅含有表头的表格
try:
if os.path.exists(self.path):
os.remove(self.path)
self.__init_templates()
else:
# 新建一个工作表对象
workbook = openpyxl.Workbook()
# 激活并重命名sheet页
sheet = workbook.active
sheet.title = '测试数据页'
# 循环之前定义的表头,从第1行第1列开始,依次写入数据
for i in range(len(self.__init_title)):
sheet.cell(row=1, column=i + 1, value=self.__init_title[i])
workbook.save(self.path)
except Exception as e:
print(e)
def write_content(self, content):
# 加载excel
workbook = openpyxl.load_workbook(self.path)
# 切换到指定的sheet页
sheet = workbook['测试数据页']
# 将content追加至sheet页中
sheet.apeed(content)
# 保存工作表
workbook.save(self.path)
四、测试数据
在项目测试的时候,涉及到的接口汇总约有5000来个。因为在家环境,无法构造如此庞大的真实接口数据,所以模拟生成了一组数据作为接口的测试结果,写入到excel表格,数据量也由5000个降低为3000个。除此之外,单条测试数据涉及到的字段也有所修改。
测试数据的生成代码如下。

五、表格写入效果

六、测试结果
6.1 写入速率总体统计
由下图可看出:
- 在同一个CPU平台中,随着数据量的提升,单条数据写入耗时也随之增加。当数据量超过1000条时,openpyxl库的耗时速率明显比xlwt库增长的更快。
- 在同一个CPU平台中,针对前N条数据写入平均耗时和总耗时,xlwt库低于openpyxl库,xlwt库的写入速率大约是openpyxl库的2.5~3倍左右。
- 同一个第三方库在不同的CPU平台上,增长趋势几乎一致。
另外,鉴于手里两台电脑的CPU性能不在同一水平上(R7-4800U性能得分842,i5-8400性能得分601),不同库在平台之间的写入速率不做深入对比。
数据来源:
桌面CPU性能排行榜,网页数据更新时间:2020-07-22
笔记本CPU性能排行榜,网页数据更新时间:2020-05-25

6.2 AMD平台写入速率统计
-
xlwt/xlrd库,单次写入最高耗时:242毫秒。

-
openpyxl库,单次写入最高耗时:549毫秒。

6.3 Inter平台写入速率统计
- xlwt/xlrd库,单次写入最高耗时:231毫秒。

- openpyxl库,单次写入最高耗时:629毫秒。

本文介绍使用Python的xlwt/xlrd与openpyxl库进行自动化测试结果写入Excel的方法,并对比两种库在不同CPU平台上的写入效率。
3247






