编写Python小程序来统计测试脚本的关键字
通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数、业务函数需要修改,那么势必要找出那些引用过这个被修改函数的地方,有些IDE支持全文查找和引用查找,而有些简单的可能就没有,因为日后要用到统计功能、和一些其它的需求,所以写了一个脚本。除了跟目录下全文查找引用过的文件外,还是支持统计查找到的数量,一次可以查找多个关键字,支持按主关键字来归类。
#encoding:utf-8
importos
importsys
importre
reload(sys)
sys.setdefaultencoding("utf-8")
short_exclude=[".svn","sendbox"]##不检查的文件、目录名
long_exclude=[]##不包含检查的文件、目录的完整路径
extend_name=[".rb"]##指定检查的文件后缀
temp_key_words=[
{
"key":"#作者:",
"display":"作者",
"times":-1,
"match":"include",
"primary_key":True,
},
{
"key":"#[summary]",
"display":"完成用例数",
"times":-1,
"match":"include",
},
{
"key":"File.expand_path",
"display":"有状态行数",
"times":-1,
"ignore_case":True,
},
{
"key":"def\s+test_",
"display":"有效用例数",
"times":-1,
"match":"regex",
"ignore_case":True,
},
{
"key":"#def\s+test_",
"display":"注释用例数",
"times":-1,
"match":"regex",
"ignore_case":True,
},
]
forkvintemp_key_words:
ifnot"key"inkv:
raise"以下的列表中没有【key】值!\n%s"%kv
ifnot"key"inkv:
raise"以下的列表中没有【display】值!\n%s"%kv
kv['times']=kv.get('times',-1)##默认为不限制检查次数
ifkv.get("ignore_case",True)==False:##默认忽略大小写
flag=0
else:
flag=re.I
kv['pattern']=re.compile(kv['key'],flag)
ifkv.get("primary_key",False):
kv['times']=1
importcopy
key_words=[]
defdeepcopy(objs):
t_list=[]
forobjinobjs:
t_list.append(copy.copy(obj))
returnt_list
defloop_case(root_dir):
t_sum=[]
printroot_dir
sub_gen=os.listdir(root_dir)
forsubinsub_gen:
ifsubinshort_exclude:##在不检查文件、目录范围中
continue
abs_path=os.path.join(root_dir,sub)
iflong_exclude:
is_exclude=False
forexcludeinlong_exclude:
ifexclude==abs_path[-len(exclude):]:
is_exclude=True
break
ifis_exclude:
continue
printabs_path
ifos.path.isdir(abs_path):
print"dir"
t_sum.extend(loop_case(abs_path))
elifos.path.isfile(abs_path):
ifnot"."+abs_path.rsplit(".",1)[1]inextend_name:##不在后缀名检查范围中
continue
print"file"
globalkey_words
key_words=deepcopy(temp_key_words)
t_sum.append(count_case(abs_path))
returnt_sum
defcount_case(abs_path):
t_dict={}
withopen(abs_path)asf:
forlinf:
l=l.strip()
match_rule(l)
index=0
count_result=[0]*len(key_words)
forkvinkey_words:
if'primary_key'inkv:
t_dict['primary_key']=kv.get('display')
t_dict['primary_key_value']=kv.get('primary_key_value',"None")
count_result[index]=-1-kv['times']
index+=1
t_dict['match_result']=count_result
t_dict['file_path']=abs_path
returnt_dict
defmatch_rule(line):
primary_key=None
forkvinkey_words:
match=False
ifkv['times']==0:##检查次数已满,不再检查
continue
ifkv.get('match',"")=="regex":##指定了匹配方式为:正则
ifkv['pattern'].match(line):##匹配正则成功
match=True
else:##默认匹配方式为:包含
ifkv['key']inline:##包含了指定字符串
match=True
ifmatch:
ifkv.get('primary_key',False):
kv['primary_key_value']=line.split(kv['key'])[1].strip()
#kv['primary_key']=False
kv['times']-=1##匹配成功,同理剩余匹配的次数-1
returnprimary_key
defformat_info(sum_list):
tip_list=[]
p_k_dict={}
fordinsum_list:
p_k=d['primary_key_value']
ifp_knotinp_k_dict:
p_k_dict[p_k]=[0]*len(key_words)
temp_list=[]
m=d['match_result']
temp_list.append("文件名称:%s\n%s:%s\n"%(d['file_path'],d['primary_key'],d['primary_key_value']))
foriinrange(len(m)):
if'primary_key'inkey_words[i]:
continue
else:
t_s=str(m[i])
temp_list.append("%s:%s\n"%(key_words[i]["display"],t_s))
p_k_dict[p_k][i]+=m[i]
tip_list.append("".join(temp_list))
p_k_dict[p_k][0]+=1
tip_list.append("===========================主键统计分割线===============================")
total_dict={}
forkvinkey_words:
if'primary_key'notinkv:
total_dict[kv['display']]=0
total_dict['全部文件数']=0
fork,vinp_k_dict.items():
temp_list=[]
temp_list.append("主键:%s\n文件总数:%s\n"%(k,v[0]))
foriinrange(1,len(v)):
temp_list.append("%s:%s\n"%(key_words[i]["display"],str(v[i])))
total_dict[key_words[i]["display"]]+=v[i]
tip_list.append("".join(temp_list))
total_dict['全部文件数']+=v[0]
tip_list.append("===========================全部统计分割线===============================")
temp_list=[]
fork,vintotal_dict.items():
temp_list.append("全部%s:%s\n"%(k,v))
tip_list.append("".join(temp_list))
tip_msg="\n".join(tip_list)
printtip_msg
open(r"sum_case.log","w").write(tip_msg)
if__name__=="__main__":
iflen(sys.argv)>1:
root_list=sys.argv[1:]
else:
root_list=[os.curdir]
sum_list=[]
forroot_dirinroot_list:
ifos.path.exists(root_dir)andos.path.isdir(root_dir):
sum_list.extend(loop_case(root_dir))
format_info(sum_list)
else:
print"给定的根目录无效\n%s"%root_dir
可以通过配置开头的设置来确定检查什么关键字,文件类型,过滤哪些文件和目录等