怎么样通过编写Python小程序来统计测试脚本的关键字
怎么样通过编写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: ##检查次数已满,不再检查
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小程序来统计测试脚本的关键字的更多相关文章
- 编写 python 小程序,将LOL官网的皮肤保存下来,上传百度云,记录那些强撸灰飞烟灭的日子
to 撸的血泪史:大学四年几乎都在宿舍打撸,So,把官网的皮肤都保存下来,存到百度云,就当一种纪念 编辑器:pycharm 用到的包:urllib.request, requests, json, r ...
- 基于php基础语言编写的小程序之计算器
基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...
- Python 小程序,对文件操作及其它
以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行 ...
- Day1:第一个python小程序
Day1:第一个python小程序与开发工具Pycharm 一.Hello World C:\Users\wenxh>python Python 3.6.2 (v3.6.2:5fd33b5, J ...
- Python获取程序运行目录和脚本目录
Python获取程序运行目录和脚本目录 import os import sys #获取脚本所在目录 print os.path.split( os.path.realpath( sys.argv[0 ...
- 利用Python代码编写计算器小程序
import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...
- Python编写购物小程序
购物车要求: 用户名和密码存放于文件中 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够 ...
- 一个有意思的Python小程序(全国省会名称随机出题)
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 最近比较迷Python,仿照<Python编程快速上手>8.5写了一个随机出卷的小 ...
- 高效编写微信小程序
原文:https://isux.tencent.com/high-performance-wechat-app-development.html 前言 微信小程序是一个工程,就和盖房子一样,打好了地基 ...
随机推荐
- BZOJ2186 SDOI2008沙拉公主的困惑(数论)
由于n!是m!的倍数,而对于每个与m!互质且小于m!的数x,x+m!.x+2*m!……也与其互质,所以答案即为(n!/m!)*φ(m!). φ(m!)=m!*∏(1-1/pi).其中的pi即为1~m中 ...
- Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- 利用Eric+Qt Designer编写倒计时时钟
[前言]前几日通过编写命令行通讯录,掌握了Python的基本语法结构,于是开始向更高水平冲击,利用Eric与Qt Designer 编写一个带界面的小程序.本次实操中也确实遇到了不少问题,通过学习也都 ...
- 【转】Word 2010 取消拼写/语法检查,隐藏红线/绿线
转自:http://blog.chinaunix.net/uid-8203698-id-3040631.html 设置方法如下,在Word菜单栏-->文件-->选项-->校对,其中“ ...
- thread 学习
#include <thread> #include <cstdio> #include <utility> #include <iostream> v ...
- BZOJ 2938: [Poi2000]病毒
2938: [Poi2000]病毒 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 693 Solved: 360[Submit][Status][Di ...
- 【BZOJ1150】数据备份(动态规划,凸优化)
[BZOJ1150]数据备份(动态规划,凸优化) 题面 BZOJ 洛谷 题解 在不考虑\(K\)的情况下很容易\(dp\) 如果把\(K\)考虑进状态显然是\(O(n^2)\)级别. 所以凸优化一下即 ...
- BZOJ 50题纪念?
是的,这次的纪念帖也比较磕碜-- 但是还有更磕碜的↓↓↓ 2017年6月7日,我在我的旧博客发了个bzoj10题纪念-- 那时我还是一个又young又simple的菜鸡(现在可能也是--),省选之后觉 ...
- 【bzoj3926】 Zjoi2015—诸神眷顾的幻想乡
http://www.lydsy.com/JudgeOnline/problem.php?id=3926 (题目链接) 题意 给出一棵树,每个节点有一个编号,范围在${[0,9]}$.一个序列是指树上 ...
- 单点登录(七)-----实战-----cas server去掉https验证
我们在搭建cas中已经说过如果不搭建https证书体系的需要去掉https的验证: 单点登录(二)----实战------简单搭建CAS---测试认证方式搭建CAS 因为cas4.2以上的代码做了一些 ...