zoukankan      html  css  js  c++  java
  • 怎么样通过编写Python小程序来统计测试脚本的关键字

    怎么样通过编写Python小程序来统计测试脚本的关键字

    通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数、业务函数需要修改,那么势必要找出那些引用过这个被修改函数的地方,有些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" : "defs+test_",
      "display" : "有效用例数",
      "times" : -1,
      "match" : "regex",
      "ignore_case" : True,
     }, 
     {
      "key" : "#defs+test_",
      "display" : "注释用例数",
      "times" : -1,
      "match" : "regex",
      "ignore_case" : True,
     }, 
    ]
     
    for kv in temp_key_words:
     if not "key" in kv:
      raise "以下的列表中没有【key】值! %s" % kv
     if not "key" in kv:
      raise "以下的列表中没有【display】值! %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) 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']).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 %s:%s " % (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 " % (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 文件总数:%s " % (k, v[0]))
      for i in range(1, len(v)):
       temp_list.append("%s:%s " % (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 " % (k,v))
     tip_list.append("".join(temp_list))
     tip_msg = " ".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 "给定的根目录无效 %s" % root_dir
    可以通过配置开头的设置来确定检查什么关键字,文件类型,过滤哪些文件和目录等
     

    上一页    

  • 相关阅读:
    android之APN
    Simple XML
    Retrofit – Java(Android) 的REST 接口封装类库
    Android 删除短信
    解决android:background背景图片被拉伸问题
    人分三等,你是哪一等?
    将android中的sample例子到eclipse中
    linux内存管理
    Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚(转)
    使用maven创建web项目
  • 原文地址:https://www.cnblogs.com/xdans/p/5412663.html
Copyright © 2011-2022 走看看