最近实现了自动生成测试报告,采用了jinja2模板,向着CI又前进了一步,做一点总结。
背景说明:
- 原来测试数据是生成在一个excel文档中,该文档中展示了更详细的数据,而测试报告中只选部分数据放在一个表格中,且针对一个场景,测试多次会有多条数据,要对其进行筛选,取最优数据
- 测试时使用的服务器硬件信息,要根据不同的服务器插入对应的数据
方案说明:
- 数据筛选处理部分,使用pandas解决
- 不同服务器信息做成子html,作为参数传入主模板html中
对数据处理代码:
import pandas as pd
def data_analysis(excel_report_name, sheet_name):
sheet_df = pd.read_excel(excel_report_name, sheet_name)
row_num = len(sheet_df.index)
if row_num != 0:
uniq_columns = ['前置数据','组件','高可用场景','故障场景']
fail_data_index = sheet_df[(sheet_df['RPO']>20) & (sheet_df['组件']!='QQ')].index
success_data_df = sheet_df.drop(fail_data_index)
sort_df = success_data_df.sort_values(by=['前置数据','组件','高可用场景','故障场景','RPO'])
uniq_df = sort_df.drop_duplicates(subset=uniq_columns, keep='last').reset_index(drop=True)
final_df = uniq_df
return final_df
主模板html
template.html
<html>
<head>
<meta charset="UTF-8">
<title>高可用测试报告</title>
<style>
body{
margin:10px 100px 10px 100px;
}
p{
text-indent:2em;
}
text_wrong{
color: red;
}
</style>
</head>
<body>
<h2>测试服务器信息</h2>
{{ server_info }}
<h2>测试数据分析</h2>
<p>测试数据如下表</p>
<table border="1">
<tr>
<th><b>序号</b></th>
<th><b>前置数据</b></th>
<th><b>组件</b></th>
<th><b>高可用场景</b></th>
<th><b>故障场景</b></th>
<th><b>RTO</b></th>
<th><b>RPO</b></th>
</tr>
{% for row_num in range(0,data_row_num) %}
<tr>
<td>{{ row_index + 1 }}</td>
<td>{{ data_df.loc[row_index, '前置数据'] }}</td>
<td>{{ data_df.loc[row_index, '组件'] }}</td>
<td>{{ data_df.loc[row_index, '高可用场景'] }}</td>
<td>{{ data_df.loc[row_index, '故障场景'] }}</td>
<td>{{ data_df.loc[row_index, 'RTO'] }}</td>
<td>{{ data_df.loc[row_index, 'RPO'] }}</td>
</tr>
</table>
</body>
</html>
子模板html
sub_module.html
<div>
<meta charset="utf-8">
<style>
table{
text-align: center;
}
</style>
<table border="1">
<tr>
<td class="table" colspan="3">{{ myserverip }}</td>
</tr>
<tr>
<td>类型</td>
<td>配置</td>
<td>数量</td>
</tr>
<tr>
<td>处理器</td>
<td>intel</td>
<td rowspan="4">1</td>
</tr>
<tr>
<td>内存</td>
<td>128G</td>
</tr>
<tr>
<td>磁盘</td>
<td>890G</td>
</tr>
<tr>
<td>管理网络</td>
<td>1*4端口千兆网卡</td>
</tr>
</table>
</div>
对模板进行渲染代码:
from jinja2 import Environment, FileSystemLoader
def html_report_render(test_data_df):
env = Environment(loder=FileSystemLoader)
template = env.get_template('template.html')
sub_module = env.get_template('sub_module.html').render(
myserverip = '127.0.0.1')
with open("gaokeyong_report.html", "w+", encoding="utf-8") as f:
out_report = template.render(
server_info = sub_module,
data_row_num = len(test_data_df.index),
data_df = test_data_df)
f.write(out_report)
f.close()
这样就能自动化生成一份测试报告,基本思路就是,对数据处理,使用jinja2写html模板,使用数据对模板进行渲染,最后生成测试报告。
|