编写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
可以通过配置开头的设置来确定检查什么关键字,文件类型,过滤哪些文件和目录等