不得不说的py那些事
大学时虽然接触过python,但由于我的无兴趣,学完就忘了。等到了工作之后才不得不重新学习(欠的债总是要还的)记录一波,留着自用。
如何学习python?
对我来说学习最好的方式,就是做相关的事,俗话说好记性不如烂笔头,看那些枯燥的文档,没几分钟注意力就不集中了。于是我开始写了第一个py代码…
做出来的第一个小东西
使用的是python2.7(比较稳定)
要做的事情是写一个自动开bug的小工具
明确思路
作为一个测试小白,因为跑CDRouter,会自动生成一个拥有bug_name&bug id&wan_mode&result……的execl表格,第一个迭代测试出的bug可以批量上报,并对着固定的bug等级进行分类上报(一般一轮迭代会有几百个bug)只需要有log和wireshark抓的包就可以了。
在生成的report中,bug_result会按照颜色区分出来,用蓝色代表一轮迭代为fail的bug。
我们要做的是
1.对execl进行操作,先遍历所有的sheet,把bug_result列结果为蓝色的筛选出来,定位它的bug_name,把bug_name作为key,sheet_name作为value存到字典里。
为什么要存value?
==>后续要通过这个value进行严重性等级的分类。
为什么用字典?
==>感觉字典方便一些,数据4000多,占用的空间也不大,速度也很快。
敲ing
blues = {}
currentpath=os.getcwd()
def read_excel(FilePath):
ExcelFile = openpyxl.load_workbook(FilePath)
SheetNames = ExcelFile.get_sheet_names()
for SheetName in SheetNames:#[IPv4 TR069 BBF069 IPv6]
if not ' '+SheetName+' ' in ' IPv4 TR069 BBF069 IPv6 ':
continue
sheet = ExcelFile.get_sheet_by_name(SheetName)
nrows = sheet.max_row
ncols = sheet.max_column
#datarow = SheetName.row_values(i)
for RowIndex in range(1,nrows):
if sheet.cell(RowIndex,1).value == 'Id':
print ncols
for ColIndex in range(1,ncols):
print sheet.cell(RowIndex,ColIndex).value
if sheet.cell(RowIndex,ColIndex).value == 'Comment':
ColIndexEnd = ColIndex - 2
ColIndexStart = ColIndexEnd #last result col
while sheet.cell(RowIndex,ColIndexStart).value != 'Synopsis':
ColIndexStart = ColIndexStart-1 # last last result col
Colname = 3
if sheet.cell(RowIndex,ColIndexEnd).value != 'Synopsis':
for i in range(RowIndex,nrows):
ce = sheet.cell(i,ColIndexEnd)
fill = ce.fill
if fill.start_color.rgb == 'FF00B0F0' and ce.value != None:
ce = sheet.cell(i,Colname)
casename = ce.value
#print casename
blues[casename] = SheetName+'/'+sheet.cell(RowIndex,ColIndexEnd).value
ColIndexEnd = ColIndexStart
blues.update(blues)
2.搞定完execl的,接下来对log进行处理,需要按照execl的字典把log存到指定文件夹里~
def read_log(path):
read_excel(FilePath)
lines = []
for file1 in os.listdir(path):
if os.path.isdir(path+'/'+file1):
for file2 in os.listdir(path+'/'+file1):
if '-retest' not in file1:
if os.path.isdir(path+'/'+file1+'/'+file2):
for file3 in os.listdir(path+'/'+file1+'/'+file2):
if os.path.isdir(path+'/'+file1+'/'+file2+'/'+file3):
CaseName = 0
for root, dirs, files in os.walk(path+'/'+file1+'/'+file2+'/'+file3):
for file in files:
if '.txt' in file and not 'start.txt' in file and not 'final.txt' in file:
CaseName = file.replace(".txt","")#not split
if blues.has_key(CaseName):
val = blues.get(CaseName)
if val != 'null':
val2 = val.split('/')[1]
if val2 in file2:
report_name = file.split('.txt')[0]
lines.append(os.path.join(root+'\\'+file))
lines.append(os.path.join(root+'\\'+report_name+'-lan.cap'))
lines.append(os.path.join(root+'\\'+report_name+'-wan.cap'))
shutil.copy(os.path.join(root+'\\'+file),os.getcwd()+'/AllFailLog')
shutil.copy(os.path.join(root+'\\'+report_name+'-lan.cap'),os.getcwd()+'/AllFailLog')
shutil.copy(os.path.join(root+'\\'+report_name+'-wan.cap'),os.getcwd()+'/AllFailLog')
剩下的就是引入selenium模块,录制mantis上面重复report bug的操作。本来想定位xpath作为selenium的定位元素,但发现每次打开同一个项目的xpath元素会变化,于是还是使用了普通的元素定位。
再上报之前判断一个严重性等级~ 这两步操作同时进行
def caseattr():
filename = currentpath+"\\Precondition\\"+"cdrouter_all_modules.xlsx"
filePath = os.path.join(os.getcwd(), filename)
x1 = xlrd.open_workbook(filePath)
caseattrdict={}
categorylist=["IPv4","IPv6","BBF069","TR069","SC"]
for category in categorylist:
sheet1 = x1.sheet_by_name(category)
sheet1_nrows=sheet1.nrows
for row in range(0,sheet1_nrows-1):
if sheet1.row_values(row)[6] in ["S2","S3","S4"]:
casename=sheet1.row_values(row)[2]
if category =="SC":
caseattrdict[casename]=sheet1.row_values(row)[6]+"/"+"IPv4"
else:
caseattrdict[casename]=sheet1.row_values(row)[6]+"/"+category
return caseattrdict
def logextract(each):
filepath=logpath+"\\"+each;
file=open(filepath,mode='r+')
logcontent=file.readlines()
if logcontent[2][0] == "M":
summary1=logcontent[1].strip('\n')
summary2=logcontent[3].strip('\n')
else:
summary1=logcontent[2].strip('\n')
summary2=logcontent[4].strip('\n')
summary=summary2.split(":")[1]+":"+summary1.split(":")[1]
file.close()
upfile=logpath+"\\"+each.replace(".txt","")+".rar"
return summary,logcontent,upfile
def handlebug(broswer,summary,content,upfile,caseattr):
reportbug.reportbug(broswer,summary,content,upfile,caseattr)
def fun():
caseattrdict=caseattr()
broswer = reportbug.mantislogin()
files=os.listdir(logpath)
casenum=0
for each in files:
if each.endswith('.txt'):
casename=each.replace(".txt","")
(summary,content,upfile)=logextract(each)
try:
handlebug(broswer,summary,content,upfile,caseattrdict[casename])
casenum=casenum+1
print "There are " +str(casenum)+ " issues report success"
except Exception as re:
print ("report case:%s Fail,ExceptionError:%s" %(each,re))
continue
print "All issues are uploaded to mantis success"
broswer.close()
fun()
最后一个就是不同案子的selenium录制了,做一个login,和report_bug
搞定
下一篇: java 读取jar包中的文件