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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上帝De助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值