工作时需整理报告用来展示该版本的质量情况,但是需要手工导出bug并整理内容,费时费力,因此,做了一个自动生成合入报告的内容,主要功能为生成bug分布图生成表格等内容。
一、环境搭建
报告主要有分为几个点:
1.写入word,包括word生成表格
2.读写excel中的内容
3.生成饼图和直方图
4.处理多维数组以生成图表
接下来就针对以上几点搭建环境
1.python_docx:比较方便使用的读写word的工具
2.Xlrd:用于读写excel的工具
3.Matplotlib:绘制图表时会使用到,配套的库还有dateutil和pyparsing
4.Numpy:多维数组使用时会使用到的库
比起写代码,搞定这么多环境才是最难的。
Python给我们提供了一个很好用的工具pip,通过该工具可以轻松搭建python环境。通过pip install + 库名称,既可安装该库,如果遇到使用pip报了编码错误,你需要这个命令chcp 936改为gbk编码,安装好上述库就可以进行报告组装了。
下面是报告的预览图:
二、绘图
可以看到这里最亮眼的就是这张饼图和直方图了,饼图统计了FT某版本各模块bug分布情况,既然要画图,那么首先需要收集数据,我的数据来源于提前生成的一份质量数据:
数据既然从excel中来,那我们第一步就是要读取这里面的内容,这就需要了解xlrd中的内容了。
读取过程如下:
1、打开excel读取数据
data = xlrd.open_workbook(self.path)
2、获取一个工作表中的内容
table = data.sheets()[2] #table = data.sheet_by_name(u'Sheet1') //通过名称获取
3、获取整行整列的值并存入数组
module = table.col_values(8) #Tag = table.row_values(i)
写入过程如下:
1、生成xls实例
book = Workbook()
2、生成sheet表
sheet1 = book.add_sheet('Sheet 1')
3、写入内容
sheet1.write(0,4,''info')//在单元格0,4处输入info
首先需要获取到第三列和第9列的内容,存在module和status两个列表中:
module = table.col_values(8) Status = table.col_values(2)
之后根据需求匹配到我们需要的内容进行统计,比如我们需要统计骚扰拦截模块已解决的bug,
for i in range(0,len(module)):
if module[i]==”骚扰拦截”and (status[i]=="已关闭" or status[i]=="已解决"):
num = num+1’
之后我们统计到各模块bug总数,就可以绘制饼图和直方图了,在绘制饼图时,方法如下
colors = ['orange','lightskyblue','magenta','yellowgreen', 'gold', 'blue', 'lightcoral']
fig = plt.figure() plt.pie(nums,labels=labels,colors=colors,autopct='%1.2f%%')
plt.title(name)
plt.savefig("Pie.jpg")
Colors数组存储饼图各部分颜色,fig = plt.figure()
生成底图
plt.title(name)绘制图片标题
plt.pie(nums,labels=labels,colors=colors,autopct='%1.2f%%')绘制饼图,入参有各模块名称及各模块对应bug数量,colors标明了各部分的颜色,autopct表示展示的百分比的格式,绘制效果如下
绘制过程中,使用到了二位数组,首先会绘制红色的部分,之后绿色蓝色浅蓝色依次进行绘制,通过plt.bar()方法绘制直方图,第一个参数表示各同色的直方相隔的距离,height和width为直方的高度和宽度,color为颜色数组中排列依次填充,label为右上角图例。List为二维数组,每个数组中的子数组为各模块对应的bug数。
Plt.xticks绘制了x轴上的中文描述,plt.legend()负责将图例添加至图片上,plt.text给直方图上方添加数字内容,这就需要计算该数字应该出现的位置,上面的三个判断条件为判断数量是几位数,动态调整数字出现的位置,以保证该数字是摆放在直方图的中间。
三,生成报告
报告是生成在word文档中,这就需要python_docx这个工具了。
首先生成document实例
document = Document()
之后生成新的段落
p = document.add_paragraph()
在段落中添加新的内容
p.add_run('Hi all,\n\n')
p.add_run('Hi all,\n\n').bold = True\\加粗
p.add_run(u'符合合入标准').font.color.rgb = RGBColor(0x42, 0x24, 0xE9)\\添加颜色 document.add_picture(r"Pie.jpg", width=Inches(4))\\插入图片并定制大小
生成表格
table = document.add_table(rows=2, cols=5,style = 'Table Grid')\\生成一个2*5的表格,表格的格式为table grid
更多表格格式可以用如下代码获得
for s in styles:
if s.type == WD_STYLE_TYPE.TABLE: document.add_paragraph("Table style is : "+ s.name)
document.add_table(3,3, style = s) document.add_paragraph("\n") document.save('demo2.docx')
根据你的需求选择合适的表格
四、各种问题处理
Python遇到最多的就是中文问题了,python2.x一般我们在写python代码时会,代码中会有中文,而默认编码为ascii,这时需要在头部添加#coding=utf-8,python3.x默认编码为unicode。
从cmd中获取中文参数时,cmd通常为gbk编码(如果不是,先chcp 936),在读入python文件时需要decode(‘GBK’),转换为当前的编码格式再进行操作。
在向word中输入中文时,需要输入的是unicode编码,因此p.add_run(u'(1) 挂起bug总数'+str(x.get_hang_up(labels))+'\n'),中文字符串前要加u将utf-8变为unicode编码。
在安装matplotlibrc时也会遇到编码问题
File "C:\Python27\lib\ntpath.py", line 84, in join result_path = result_path + p_path UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 1
解决方法:把ntpath中的
result_path = result_path + p_path
改为:
result_path = str(result_path) + str(p_path)
总之,中文编码问题是很常见的,见招拆招就好,首先要明确输入端目前的编码格式是什么,输出端的编码格式要什么,再结合错误信息来回变换编码格式就好。
作者 |蒋雪峰 腾讯系统测试工程师
编辑 | Coding小编
欢迎有兴趣的小伙伴微信关注“腾讯课堂”(微信号:tencent-class)收获更多福利~
网友评论