编写Python小程序来统计测试脚本的关键字

519次阅读  |  发布于5年以前

通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数、业务函数需要修改,那么势必要找出那些引用过这个被修改函数的地方,有些IDE支持全文查找和引用查找,而有些简单的可能就没有,因为日后要用到统计功能、和一些其它的需求,所以写了一个脚本。除了跟目录下全文查找引用过的文件外,还是支持统计查找到的数量,一次可以查找多个关键字,支持按主关键字来归类。


    #encoding: utf-8 
    import os 
    import sys 
    import re 

    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, 
      },   
    ] 

    for kv in temp_key_words: 
      if not "key" in kv: 
        raise "以下的列表中没有【key】值!\n%s" % kv 
      if not "key" in kv: 
        raise "以下的列表中没有【display】值!\n%s" % kv   
      kv['times'] = kv.get('times', -1)  ##默认为不限制检查次数    
      if kv.get("ignore_case", True)==False: ##默认忽略大小写 
        flag = 0 
      else: 
        flag = re.I     
      kv['pattern'] = re.compile(kv['key'], flag) 
      if kv.get("primary_key", False): 
        kv['times'] = 1 
    import copy 
    key_words = []     

    def deepcopy(objs): 
      t_list = [] 
      for obj in objs: 
        t_list.append(copy.copy(obj)) 
      return t_list 

    def loop_case(root_dir): 
      t_sum = [] 
      print root_dir 
      sub_gen = os.listdir(root_dir) 
      for sub in sub_gen: 
        if sub in short_exclude: ##在不检查文件、目录范围中 
          continue 
        abs_path = os.path.join(root_dir, sub) 
        if long_exclude: 
          is_exclude = False 
          for exclude in long_exclude: 
            if exclude == abs_path[-len(exclude):]: 
              is_exclude = True 
              break 
          if is_exclude: 
            continue 
        print abs_path 
        if os.path.isdir(abs_path): 
          print "dir" 
          t_sum.extend(loop_case(abs_path)) 
        elif os.path.isfile(abs_path):       
          if not "." + abs_path.rsplit(".", 1)[1] in extend_name: ##不在后缀名 检查范围中 
            continue 
          print "file" 
          global key_words  
          key_words = deepcopy(temp_key_words)      
          t_sum.append(count_case(abs_path))  
      return t_sum     

    def count_case(abs_path):   
      t_dict = {} 
      with open(abs_path) as f: 
        for l in f: 
          l = l.strip() 
          match_rule(l)  
      index = 0 
      count_result = [0] * len(key_words)    
      for kv in key_words:  
        if 'primary_key' in kv: 
          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  
      return t_dict 

    def match_rule(line): 
      primary_key = None  
      for kv in key_words: 
        match = False          
        if kv['times']==0: ##检查次数已满,不再检查 
          continue 
        if kv.get('match', "") == "regex": ##指定了匹配方式为:正则 
          if kv['pattern'].match(line):  ##匹配正则成功 
            match = True 
        else:  ##默认匹配方式为: 包含 
          if kv['key'] in line:  ##包含了指定字符串 
            match = True 
        if match: 
          if kv.get('primary_key', False): 
            kv['primary_key_value'] = line.split(kv['key'])[1].strip()   
    #        kv['primary_key'] = False       
          kv['times'] -= 1      ##匹配成功,同理剩余匹配的次数 -1 
      return primary_key     

    def format_info(sum_list): 
      tip_list = []   
      p_k_dict = {} 
      for d in sum_list: 
        p_k = d['primary_key_value'] 
        if p_k not in p_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'])) 
        for i in range(len(m)): 
          if 'primary_key' in key_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 = {} 
      for kv in key_words: 
        if 'primary_key' not in kv: 
          total_dict[kv['display']] = 0 
      total_dict['全部文件数'] = 0 
      for k,v in p_k_dict.items(): 
        temp_list = [] 
        temp_list.append("主键:%s\n文件总数:%s\n" % (k, v[0])) 
        for i in range(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 = [] 
      for k,v in total_dict.items(): 
        temp_list.append("全部%s:%s\n" % (k,v)) 
      tip_list.append("".join(temp_list)) 
      tip_msg = "\n".join(tip_list) 
      print tip_msg 
      open(r"sum_case.log", "w").write(tip_msg) 

    if __name__=="__main__": 
      if len(sys.argv) > 1: 
        root_list = sys.argv[1:] 
      else: 
        root_list = [os.curdir] 
      sum_list = [] 
      for root_dir in root_list:   
        if os.path.exists(root_dir) and os.path.isdir(root_dir): 
          sum_list.extend(loop_case(root_dir)) 
          format_info(sum_list) 
        else: 
          print "给定的根目录无效\n%s" % root_dir 

可以通过配置开头的设置来确定检查什么关键字,文件类型,过滤哪些文件和目录等

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8