編寫Python小程序來(lái)統(tǒng)計(jì)測(cè)試腳本的關(guān)鍵字
通常自動(dòng)化測(cè)試項(xiàng)目到了一定的程序,編寫的測(cè)試代碼自然就會(huì)很多,如果很早已經(jīng)編寫的測(cè)試腳本現(xiàn)在某些基礎(chǔ)函數(shù)、業(yè)務(wù)函數(shù)需要修改,那么勢(shì)必要找出那些引用過(guò)這個(gè)被修改函數(shù)的地方,有些IDE支持全文查找和引用查找,而有些簡(jiǎn)單的可能就沒(méi)有,因?yàn)槿蘸笠玫浇y(tǒng)計(jì)功能、和一些其它的需求,所以寫了一個(gè)腳本。除了跟目錄下全文查找引用過(guò)的文件外,還是支持統(tǒng)計(jì)查找到的數(shù)量,一次可以查找多個(gè)關(guān)鍵字,支持按主關(guān)鍵字來(lái)歸類。
#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" : "完成用例數(shù)",
"times" : -1,
"match" : "include",
},
{
"key" : "File.expand_path",
"display" : "有狀態(tài)行數(shù)",
"times" : -1,
"ignore_case" : True,
},
{
"key" : "def\s+test_",
"display" : "有效用例數(shù)",
"times" : -1,
"match" : "regex",
"ignore_case" : True,
},
{
"key" : "#def\s+test_",
"display" : "注釋用例數(shù)",
"times" : -1,
"match" : "regex",
"ignore_case" : True,
},
]
for kv in temp_key_words:
if not "key" in kv:
raise "以下的列表中沒(méi)有【key】值!\n%s" % kv
if not "key" in kv:
raise "以下的列表中沒(méi)有【display】值!\n%s" % kv
kv['times'] = kv.get('times', -1) ##默認(rèn)為不限制檢查次數(shù)
if kv.get("ignore_case", True)==False: ##默認(rèn)忽略大小寫
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: ##檢查次數(shù)已滿,不再檢查
continue
if kv.get('match', "") == "regex": ##指定了匹配方式為:正則
if kv['pattern'].match(line): ##匹配正則成功
match = True
else: ##默認(rèn)匹配方式為: 包含
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 ##匹配成功,同理剩余匹配的次數(shù) -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("===========================主鍵統(tǒng)計(jì)分割線===============================")
total_dict = {}
for kv in key_words:
if 'primary_key' not in kv:
total_dict[kv['display']] = 0
total_dict['全部文件數(shù)'] = 0
for k,v in p_k_dict.items():
temp_list = []
temp_list.append("主鍵:%s\n文件總數(shù):%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['全部文件數(shù)'] += v[0]
tip_list.append("===========================全部統(tǒng)計(jì)分割線===============================")
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 "給定的根目錄無(wú)效\n%s" % root_dir
可以通過(guò)配置開頭的設(shè)置來(lái)確定檢查什么關(guān)鍵字,文件類型,過(guò)濾哪些文件和目錄等
相關(guān)文章
allure結(jié)合python生成測(cè)試報(bào)告教程
這篇文章主要介紹了allure結(jié)合python生成測(cè)試報(bào)告教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Python著名游戲?qū)崙?zhàn)之方塊連接 我的世界
讀萬(wàn)卷書不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你模仿著名游戲——我的世界,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10
pycharm創(chuàng)建scrapy項(xiàng)目教程及遇到的坑解析
這篇文章主要介紹了pycharm創(chuàng)建scrapy項(xiàng)目教程及遇到的坑解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python對(duì)中國(guó)500強(qiáng)排行榜數(shù)據(jù)進(jìn)行可視化分析實(shí)戰(zhàn)
這篇文章主要介紹了Python對(duì)中國(guó)500強(qiáng)排行榜數(shù)據(jù)進(jìn)行可視化分析實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
編寫Python腳本來(lái)獲取mp3文件tag信息的教程
這篇文章主要介紹了編寫Python腳本來(lái)獲取mp3文件tag信息的教程,代碼基于Python2.x,文中的注釋很詳細(xì),需要的朋友可以參考下2015-05-05

