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


Posted in Python onMarch 12, 2016

通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数、业务函数需要修改,那么势必要找出那些引用过这个被修改函数的地方,有些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

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

Python 相关文章推荐
如何高效使用Python字典的方法详解
Aug 31 Python
python先序遍历二叉树问题
Nov 10 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
Python如何发布程序的详细教程
Oct 09 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
django用户登录验证的完整示例代码
Jul 21 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
解决echarts中饼图标签重叠的问题
May 16 Python
python 实现表情识别
Nov 21 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 #Python
Python语言的面相对象编程方式初步学习
Mar 12 #Python
举例讲解Python中的list列表数据结构用法
Mar 12 #Python
Python中的if、else、elif语句用法简明讲解
Mar 11 #Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 #Python
简单讲解Python中的数字类型及基本的数学计算
Mar 11 #Python
详解Python中的变量及其命名和打印
Mar 11 #Python
You might like
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript数组使用调用方法汇总
2007/12/08 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Python读写配置文件的方法
2015/06/03 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Python pymsql模块的使用
2020/09/07 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
护士见习期自我鉴定
2014/02/08 职场文书
2015年公司新年寄语
2014/12/08 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
员工聘用合同范本
2015/09/21 职场文书