LDRA Testbed软件静态分析_操作指南
LDRA Testbed软件静态分析_自动提取静态分析数据生成文档
LDRA Testbed软件静态分析_Jenkins持续集成
LDRA Testbed软件静态分析_软件质量度量
LDRA Testbed软件静态分析_常见问题及处理
LDRA Testbed软件单元测试_操作指南
LDRA Testbed软件单元测试_常见问题及处理
LDRA Testbed软件集成测试_操作指南
LDRA Testbed软件集成测试_常见问题及处理
前面在第一章《LDRA Testbed软件静态分析_操作指南》中已经讲了如何使用Testbed进行软件静态分析,但是生成的静态分析结果为htm格式的网页文件,对于要将静态分析结果保存为文档格式输出报告的朋友来说不是很友好。于是我自己编写了一个自动化的软件小工具,用于自动提取code review静态分析报告(文件名为“*.rps.htm”)中的数据,按条目生成出一个excel文档。
效果如下:
Testbed 9.8.5版本:
Testbed 10.1.0版本:
由于Testbed 10.x.x版本和9.x.x版本的code review静态分析报告的格式变化比较大,代码不能通用。后面以9.8.5版本和10.1.0版本为例,将两个版本自动提取code review静态分析报告的python脚本代码分别贴出来,供大家参考(思路是一样的,只是对提取信息的格式匹配不同)。
如果没有特殊的更改需求,没有python编码基础,也可以直接去下载打包出的可执行文件:
针对Testbed 9.8.5版本,可戳:Testbed code review静态分析报告文档生成工具(适用于testbed 9.8.5版本) 进行下载;
针对Testbed 10.1.0版本,可戳:Testbed code review静态分析报告文档生成工具(适用于testbed 10.1.0版本) 进行下载。
对于Testbed版本不适用,或者自己想更改报告格式,可以参考以下的代码,移植更改(以下代码是在python3环境下写的,python2可能有些差异)
代码如下(示例):
#写入固定内容
def WriteConst(sheet, line_num ):
sheet.write(line_num,0,line_num,ExcelStyle.style_list) #写入序号
sheet.write(line_num,7,software_version,ExcelStyle.style_list) #写入被测软件版本
sheet.write(line_num,8,check_time,ExcelStyle.style_list) #写入检查时间
sheet.write(line_num,9,development_engineer,ExcelStyle.style_list) #写入开发人员
sheet.write(line_num,12,test_engineer,ExcelStyle.style_list) #写入测试人员
#写入规则编号
def write_rule_num(sheet,i,rule_description):
global rule_num_list,rule_description_list
rule_idx = 0
if 'Non standard character' in rule_description: #因违规的特殊字符不确定,此处做特殊处理
sheet.write(i,4,'113S',ExcelStyle.style_list)
return
for rule in rule_description_list:
if rule in rule_description:
sheet.write(i,4,rule_num_list[rule_idx],ExcelStyle.style_list)
break
rule_idx += 1
#特殊字符处理
def special_char_deal(string):
new_str = string.replace('<','<')
new_str = new_str.replace('>','>')
new_str = new_str.strip()
return new_str
#主函数
def violation_main():
#初始化
i=1
file_line_num=0
globals_flag = 0
globals_start = 0
func_flag = 0
func_start = 0
print('Executing...')
read_config()
#新建一个excel文件
file=xlwt.Workbook(encoding='utf-8',style_compression=0)
#新建一个sheet
sheet=file.add_sheet('violations')
#写入表头
list_title = ["序号","文件名","函数名","行数","违规编号","违规说明","违规等级","软件版本","检查时间","开发人员","研发确认","处理方式","测试人员","违规状态","备注"]
for j in range(0,15):
sheet.write(0,j,list_title[j],ExcelStyle.style_title)
htm_file = get_file(violation_htm_path,"*.rps.htm*")
if htm_file != 0:
with open(htm_file,'r',errors='ignore') as fopen_r:
lines=fopen_r.readlines()
#写入violations
for line in lines:
file_line_num += 1 #当前读取的文件行数(用于调试)
if line.find("Globals / code outside procedures") != -1:
globals_flag = 1
#开始写入Globals / code outside procedures部分的violations
if globals_flag == 1 and line.find("File: Src Line") != -1:
globals_start = 1
if globals_start == 1:
searchObj_nofunc = re.search(r'<TR><td align=center> <a id=.*>(.*?)</a> </td><td > (.*?)\: (.*?) </td><td > (.*?) </td>',line,re.I) #获取文件名、违规
if searchObj_nofunc != None:
sheet.write(i,1,searchObj_nofunc.group(2),ExcelStyle.style_list) #写入文件名
sheet.write(i,3,searchObj_nofunc.group(3),ExcelStyle.style_list) #写入文件行数
rule_description = special_char_deal(searchObj_nofunc.group(4))
write_rule_num(sheet,i,rule_description) #写入规则编号
sheet.write(i,5,rule_description,ExcelStyle.style_list) #写入不合格项
sheet.write(i,6,searchObj_nofunc.group(1),ExcelStyle.style_list) #写入违规等级
sheet.write(i,2,'——',ExcelStyle.style_list) #写入函数名'--'
WriteConst(sheet,i) #写入其他固定项
i = i+1
else:
searchObj_nofunc = re.search(r'<TR><td align=center> (.*?) </td><td > (.*?)\: (.*?) </td><td > (.*?) </td>',line,re.I) #获取文件名、行数、违规
if searchObj_nofunc != None:
sheet.write(i,