编写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)[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

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

(0)

相关推荐

  • Python中super关键字用法实例分析

    本文实例讲述了Python中super关键字用法.分享给大家供大家参考.具体分析如下: 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" A.__init

  • 基于Python的关键字监控及告警

    为了解决日志文件监控的问题, 使用python脚本完成了基于关键字的告警功能 环境 python 2.7 依赖包 time \ traceback \ filelock \ logging 代码如下: #!/bin/python #coding:utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') import re import os from urllib import urlencode import logging imp

  • Python 中的with关键字使用详解

    在 Python 2.5 中, with 关键字被加入.它将常用的 try ... except ... finally ... 模式很方便的被复用.看一个最经典的例子: with open('file.txt') as f: content = f.read() 在这段代码中,无论 with 中的代码块在执行的过程中发生任何情况,文件最终都会被关闭.如果代码块在执行的过程中发生了一个异常,那么在这个异常被抛出前,程序会先将被打开的文件关闭. 再看另外一个例子. 在发起一个数据库事务请求的时候,

  • Python中关键字is与==的区别简述

    本文以简单示例分析了python中关键字is与 ==的区别,供大家参考一下. 首先说明一下Python学习中几个相关的小知识点. Python中的对象包含三要素:id.type.value 其中:id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来判断的 ==判断的是a对象的值是否和b对象的值相等,是通过value来判断的 具体示例如下: >>> a=100 >>> b=100.0 >>>

  • python关键字and和or用法实例

    python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值. or也是从左到有计算表达式,返回第一个为真的值. 复制代码 代码如下: IDLE 1.2.4 >>>'a'and'b' 'b' >>>''and'b' '' >>>'a'or'b' 'a' >>>''or'b' 'b' 类似三目表达式的用法:bool? a : b 复制代码 代码如下: >>> a ='first

  • phpsir 开发 一个检测百度关键字网站排名的python 程序

    源码如下 :保存成utf-8 bd.py 文件 复制代码 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib ,urllib2 import re def baidu(w): url= "http://www.baidu.com/s?" values = { "w":w.encode('gbk','ignore') } data = urllib.urlencode

  • 深入解析Python编程中super关键字的用法

    官方文档中关于super的定义说的不是很多,大致意思是返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则,最常用的情况如下面这个例子所示: class C(B): def method(self, arg): super(C, self).method(arg) 子类C重写了父类B中同名方法method,在重写的实现中通过super实例化的代理对象调用父类的同名方法. super类的初始方法签名如下: def __init__(self, type1, type2=None

  • Python中关键字nonlocal和global的声明与解析

    一.Python中global与nonlocal 声明 如下代码 a = 10 def foo(): a = 100 执行foo() 结果 a 还是10 函数中对变量的赋值,变量始终绑定到该函数的局部命名空间,使用global 语句可以改变这种行为. >>> a 10 >>> def foo(): ... global a ... a = 100 ... >>> a 10 >>> foo() >>> a 100 解析

  • Python爬虫:通过关键字爬取百度图片

    使用工具:Python2.7 点我下载 scrapy框架 sublime text3 一.搭建python(Windows版本)  1.安装python2.7 ---然后在cmd当中输入python,界面如下则安装成功  2.集成Scrapy框架----输入命令行:pip install Scrapy 安装成功界面如下: 失败的情况很多,举例一种: 解决方案: 其余错误可百度搜索. 二.开始编程. 1.爬取无反爬虫措施的静态网站.例如百度贴吧,豆瓣读书. 例如-<桌面吧>的一个帖子https:

  • Python查询阿里巴巴关键字排名的方法

    本文实例讲述了Python查询阿里巴巴关键字排名的方法.分享给大家供大家参考.具体如下: 这里使用python库urllib及pyquery基本东西的应用,实现阿里巴巴关键词排名的查询,其中涉及到urllib代理的设置,pyquery对html文档的解析 1. urllib 基础模块的应用,通过该类获取到url中的html文档信息,内部可以重写代理的获取方法 class ProxyScrapy(object): def __init__(self): self.proxy_robot = Pro

随机推荐