编写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实现网站文件的全备份和差异备份
Nov 30 Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
总结python中pass的作用
Feb 27 Python
Python中新式类与经典类的区别详析
Jul 10 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
Python常用编译器原理及特点解析
Mar 23 Python
python 8种必备的gui库
Aug 27 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
详解Python生成器和基于生成器的协程
Jun 03 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
用在PHP里的JS打印函数
2006/10/09 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
2014/06/03 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
pyside写ui界面入门示例
2014/01/22 Python
Python程序设计入门(4)模块和包
2014/06/16 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
班级活动策划书
2014/02/06 职场文书
文艺晚会主持词
2014/03/24 职场文书
护士医德医风自我评价
2014/09/15 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
小石潭记导游词
2015/02/03 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
如何做好员工培训计划?
2019/07/09 职场文书