编写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 fileinput模块使用介绍
Nov 30 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
Python语言进阶知识点总结
May 28 Python
python字符串查找函数的用法详解
Jul 08 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
Django如何将URL映射到视图
Jul 29 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
python调用接口的4种方式代码实例
Nov 19 Python
python中取绝对值简单方法总结
Jul 24 Python
Python根据字典的值查询出对应的键的方法
Sep 30 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
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
Javascript Objects详解
2014/09/04 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
python实现贪吃蛇小游戏
2020/03/21 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
电子商务网站的创业计划书
2014/01/05 职场文书
教师研修随笔感言
2014/01/23 职场文书
村级个人对照检查材料
2014/08/22 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
汇报材料怎么写
2014/12/30 职场文书
上下班时间调整通知
2015/04/23 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python