怎么样通过编写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" : "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) 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\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小程序来统计测试脚本的关键字的更多相关文章

  1. 编写 python 小程序,将LOL官网的皮肤保存下来,上传百度云,记录那些强撸灰飞烟灭的日子

    to 撸的血泪史:大学四年几乎都在宿舍打撸,So,把官网的皮肤都保存下来,存到百度云,就当一种纪念 编辑器:pycharm 用到的包:urllib.request, requests, json, r ...

  2. 基于php基础语言编写的小程序之计算器

    基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...

  3. Python 小程序,对文件操作及其它

    以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行 ...

  4. Day1:第一个python小程序

    Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...

  5. Python获取程序运行目录和脚本目录

    Python获取程序运行目录和脚本目录 import os import sys #获取脚本所在目录 print os.path.split( os.path.realpath( sys.argv[0 ...

  6. 利用Python代码编写计算器小程序

    import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...

  7. Python编写购物小程序

    购物车要求: 用户名和密码存放于文件中 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够 ...

  8. 一个有意思的Python小程序(全国省会名称随机出题)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 最近比较迷Python,仿照<Python编程快速上手>8.5写了一个随机出卷的小 ...

  9. 高效编写微信小程序

    原文:https://isux.tencent.com/high-performance-wechat-app-development.html 前言 微信小程序是一个工程,就和盖房子一样,打好了地基 ...

随机推荐

  1. Python2X和Python3X的区别

    python2X:源码重复不规范python3X:整合源码,更清晰简单优美.         python2X:默认的编码是ascii  (解决办法为第一行添加 :  #-*- encoding:ut ...

  2. Install .Net Core For CentOS

    Install .NET Core SDK Before you start, please remove any previous versions of .NET Core from your s ...

  3. JVM学习笔记(二):垃圾收集

    程序计数器. 虚拟机栈. 本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作. 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这 ...

  4. PGM学习之二 PGM模型的分类与简介

    废话:和上一次的文章确实隔了太久,希望趁暑期打酱油的时间,将之前学习的东西深入理解一下,同时尝试用Python写相关的机器学习代码. 一 PGM模型的分类 通过上一篇文章的介绍,相信大家对PGM的定义 ...

  5. 【BZOJ2830/洛谷3830】随机树(动态规划)

    [BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...

  6. 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告

    P4279 [SHOI2008]小约翰的游戏 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子 ...

  7. Java EE之Servlet

    1.创建Servlet类 Servlet在Java EE API规范中的定义: Servlet是一个运行在Web服务器中的Java小程序.Servlet将会接收和响应来自Web客户端的请求,使用HTT ...

  8. 【loj2586】【APIO2018】选圆圈

    题目 有 \(n\) 个圆$c_1,c_2, \cdots , c_n $,执行如下的操作: 找到剩下的半径最大的圆删除并删除所有和它有交的其他并没有被删除的圆: 求每个圆是被那个圆删除的: $1 \ ...

  9. oracle的loop

    oracle的loop等循环语句的几个用法小例子 --loop循环用法 (输出1到10) ) :; begin loop v_num :; ; --上面退出循环也可以用下面3行 /* if(v_num ...

  10. HDU 4825 tire树

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...