目錄
一、測試需求描述
二、實現(xiàn)方法
三、Excel表格樣式
四、實現(xiàn)代碼(代碼才是王道,有注釋很容易就能看明白的)
一、測試需求描述
對服務后臺一系列的http接口功能測試。
輸入:根據(jù)接口描述構造不同的參數(shù)輸入值
輸出:XML文件
eg:http://xxx.com/xxx_product/test/content_book_list.jsp?listid=1
二、實現(xiàn)方法
1、選用Python腳本來驅動測試
2、采用Excel表格管理測試數(shù)據(jù),包括用例的管理、測試數(shù)據(jù)錄入、測試結果顯示等等,這個需要封裝一個Excel的類即可。
3、調用http接口采用Python封裝好的API即可
4、測試需要的http組裝字符轉處理即可
5、設置2個檢查點,XML文件中的返回值字段(通過解析XML得到);XML文件的正確性(文件對比)
6、首次執(zhí)行測試采用半自動化的方式,即人工檢查輸出的XML文件是否正確,一旦正確將封存XML文件,為后續(xù)回歸測試的預期結果,如果發(fā)現(xiàn)錯誤手工修正為預期文件。(注意不是每次測試都人工檢查該文件,只首次測試的時候才檢查)
三、Excel表格樣式
四、實現(xiàn)代碼(代碼才是王道,有注釋很容易就能看明白的)
1、測試框架代碼
#****************************************************************??
#?TestFrame.py??
#?Author?????:?Vince??
#?Version????:?1.1.2??
#?Date???????:?2011-3-14??
#?Description:?自動化測試平臺??
#****************************************************************??
??
import?os,sys,?urllib,?httplib,?profile,?datetime,?time??
from?xml2dict?import?XML2Dict??
import?win32com.client??
from?win32com.client?import?Dispatch??
import?xml.etree.ElementTree?as?et??
#import?MySQLdb??
??
#Excel表格中測試結果底色??
OK_COLOR=0xffffff??
NG_COLOR=0xff??
#NT_COLOR=0xffff??
NT_COLOR=0xC0C0C0??
??
#Excel表格中測試結果匯總顯示位置??
TESTTIME=[1,?14]??
TESTRESULT=[2,?14]??
??
#Excel模版設置??
#self.titleindex=3????????#Excel中測試用例標題行索引??
#self.casebegin?=4????????#Excel中測試用例開始行索引??
#self.argbegin???=3???????#Excel中參數(shù)開始列索引??
#self.argcount??=8????????#Excel中支持的參數(shù)個數(shù)??
class?create_excel:??
????def?__init__(self,?sFile,?dtitleindex=3,?dcasebegin=4,?dargbegin=3,?dargcount=8):??
????????self.xlApp?=?win32com.client.Dispatch('et.Application')???#MS:Excel??WPS:et??
????????try:??
????????????self.book?=?self.xlApp.Workbooks.Open(sFile)??
????????except:??
????????????print_error_info()??
????????????print?"打開文件失敗"??
????????????exit()??
????????self.file=sFile??
????????self.titleindex=dtitleindex??
????????self.casebegin=dcasebegin??
????????self.argbegin=dargbegin??
????????self.argcount=dargcount??
????????self.allresult=[]??
??????????
????????self.retCol=self.argbegin+self.argcount??
????????self.xmlCol=self.retCol+1??
????????self.resultCol=self.xmlCol+1??
??
????def?close(self):??
????????#self.book.Close(SaveChanges=0)??
????????self.book.Save()??
????????self.book.Close()??
????????#self.xlApp.Quit()??
????????del?self.xlApp??
??????????
????def?read_data(self,?iSheet,?iRow,?iCol):??
????????try:??
????????????sht?=?self.book.Worksheets(iSheet)??
????????????sValue=str(sht.Cells(iRow,?iCol).Value)??
????????except:??
????????????self.close()??
????????????print('讀取數(shù)據(jù)失敗')??
????????????exit()??
????????#去除'.0'??
????????if?sValue[-2:]=='.0':??
????????????sValue?=?sValue[0:-2]??
????????return?sValue??
??
????def?write_data(self,?iSheet,?iRow,?iCol,?sData,?color=OK_COLOR):??
????????try:??
????????????sht?=?self.book.Worksheets(iSheet)??
????????????sht.Cells(iRow,?iCol).Value?=?sData.decode("utf-8")??
????????????sht.Cells(iRow,?iCol).Interior.Color=color??
????????????self.book.Save()??
????????except:??
????????????self.close()??
????????????print('寫入數(shù)據(jù)失敗')??
????????????exit()??
??????
????#獲取用例個數(shù)??????
????def?get_ncase(self,?iSheet):??
????????try:??
????????????return?self.get_nrows(iSheet)-self.casebegin+1??
????????except:??
????????????self.close()??
????????????print('獲取Case個數(shù)失敗')??
????????????exit()??
??????
????def?get_nrows(self,?iSheet):??
????????try:??
????????????sht?=?self.book.Worksheets(iSheet)??
????????????return?sht.UsedRange.Rows.Count??
????????except:??
????????????self.close()??
????????????print('獲取nrows失敗')??
????????????exit()??
??
????def?get_ncols(self,?iSheet):??
????????try:??
????????????sht?=?self.book.Worksheets(iSheet)??
????????????return?sht.UsedRange.Columns.Count??
????????except:??
????????????self.close()??
????????????print('獲取ncols失敗')??
????????????exit()??
??????
????def?del_testrecord(self,?suiteid):??
????????try:??
????????????#為提升性能特別從For循環(huán)提取出來??
????????????nrows=self.get_nrows(suiteid)+1??
????????????ncols=self.get_ncols(suiteid)+1??
????????????begincol=self.argbegin+self.argcount??
??????????????
????????????#提升性能??
????????????sht?=?self.book.Worksheets(suiteid)??
??
????????????for?row?in?range(self.casebegin,?nrows):??
????????????????for?col?in?range(begincol,?ncols):??
????????????????????str=self.read_data(suiteid,?row,?col)??
????????????????????#清除實際結果[]??
????????????????????startpos?=?str.find('[')??
????????????????????if?startpos>0:??
????????????????????????str?=?str[0:startpos].strip()??
????????????????????????self.write_data(suiteid,?row,?col,?str,?OK_COLOR)??
????????????????????else:??
????????????????????????#提升性能??
????????????????????????sht.Cells(row,?col).Interior.Color?=?OK_COLOR??
????????????????#清除TestResul列中的測試結果,設置為NT??
????????????????self.write_data(suiteid,?row,??self.argbegin+self.argcount+1,?'?',?OK_COLOR)??
????????????????self.write_data(suiteid,?row,?self.resultCol,?'NT',?NT_COLOR)??
????????except:??
????????????self.close()??
????????????print('清除數(shù)據(jù)失敗')??
????????????exit()??
??
#執(zhí)行調用??
def?HTTPInvoke(IPPort,?url):??
????conn?=?httplib.HTTPConnection(IPPort)??
????conn.request("GET",?url)??
????rsps?=?conn.getresponse()??
????data?=?rsps.read()??
????conn.close()??
????return?data??
??
#獲取用例基本信息[Interface,argcount,[ArgNameList]]??
def?get_caseinfo(Data,?SuiteID):??
????caseinfolist=[]??
????sInterface=Data.read_data(SuiteID,?1,?2)???
????argcount=int(Data.read_data(SuiteID,?2,?2))???
??????
????#獲取參數(shù)名存入ArgNameList???
????ArgNameList=[]??
????for?i?in?range(0,?argcount):??
????????ArgNameList.append(Data.read_data(SuiteID,?Data.titleindex,?Data.argbegin+i))????
??????
????caseinfolist.append(sInterface)??
????caseinfolist.append(argcount)??
????caseinfolist.append(ArgNameList)??
????return?caseinfolist??
??
#獲取輸入??
def?get_input(Data,?SuiteID,?CaseID,?caseinfolist):??
????sArge=''??
????#參數(shù)組合??
????for?j?in?range(0,?caseinfolist[1]):??
????????if?Data.read_data(SuiteID,?Data.casebegin+CaseID,?Data.argbegin+j)?!=?"None":??
????????????sArge=sArge+caseinfolist[2][j]+'='+Data.read_data(SuiteID,?Data.casebegin+CaseID,?Data.argbegin+j)+'&'???
??????
????#去掉結尾的&字符??
????if?sArge[-1:]=='&':??
????????sArge?=?sArge[0:-1]?????
????sInput=caseinfolist[0]+sArge????#組合全部參數(shù)??
????return?sInput??
???
#結果判斷???
def?assert_result(sReal,?sExpect):??
????sReal=str(sReal)??
????sExpect=str(sExpect)??
????if?sReal==sExpect:??
????????return?'OK'??
????else:??
????????return?'NG'??
??
#將測試結果寫入文件??
def?write_result(Data,?SuiteId,?CaseId,?resultcol,?*result):??
????if?len(result)>1:??
????????ret='OK'??
????????for?i?in?range(0,?len(result)):??
????????????if?result[i]=='NG':??
????????????????ret='NG'??
????????????????break??
????????if?ret=='NG':??
????????????Data.write_data(SuiteId,?Data.casebegin+CaseId,?resultcol,ret,?NG_COLOR)??
????????else:??
????????????Data.write_data(SuiteId,?Data.casebegin+CaseId,?resultcol,ret,?OK_COLOR)??
????????Data.allresult.append(ret)??
????else:??
????????if?result[0]=='NG':??
????????????Data.write_data(SuiteId,?Data.casebegin+CaseId,?resultcol,result[0],?NG_COLOR)??
????????elif?result[0]=='OK':??
????????????Data.write_data(SuiteId,?Data.casebegin+CaseId,?resultcol,result[0],?OK_COLOR)??
????????else:??#NT??
????????????Data.write_data(SuiteId,?Data.casebegin+CaseId,?resultcol,result[0],?NT_COLOR)??
????????Data.allresult.append(result[0])??
??????
????#將當前結果立即打印??
????print?'case'+str(CaseId+1)+':',?Data.allresult[-1]??
??
#打印測試結果??
def?statisticresult(excelobj):??
????allresultlist=excelobj.allresult??
????count=[0,?0,?0]??
????for?i?in?range(0,?len(allresultlist)):??
????????#print?'case'+str(i+1)+':',?allresultlist[i]??
????????count=countflag(allresultlist[i],count[0],?count[1],?count[2])??
????print?'Statistic?result?as?follow:'??
????print?'OK:',?count[0]??
????print?'NG:',?count[1]??
????print?'NT:',?count[2]??
??
#解析XmlString返回Dict??
def?get_xmlstring_dict(xml_string):??
????xml?=?XML2Dict()??
????return?xml.fromstring(xml_string)??
??????
#解析XmlFile返回Dict???
def?get_xmlfile_dict(xml_file):??
????xml?=?XML2Dict()??
????return?xml.parse(xml_file)??
??
#去除歷史數(shù)據(jù)expect[real]??
def?delcomment(excelobj,?suiteid,?iRow,?iCol,?str):??
????startpos?=?str.find('[')??
????if?startpos>0:??
????????str?=?str[0:startpos].strip()??
????????excelobj.write_data(suiteid,?iRow,?iCol,?str,?OK_COLOR)??
????return?str??
??????
#檢查每個item?(非結構體)??
def?check_item(excelobj,?suiteid,?caseid,real_dict,?checklist,?begincol):??
????ret='OK'??
????for?checkid?in?range(0,?len(checklist)):??
????????real=real_dict[checklist[checkid]]['value']??
????????expect=excelobj.read_data(suiteid,?excelobj.casebegin+caseid,?begincol+checkid)??
??????????
????????#如果檢查不一致測將實際結果寫入expect字段,格式:expect[real]??
????????#將return?NG??
????????result=assert_result(real,?expect)??
????????if?result=='NG':??
????????????writestr=expect+'['+real+']'??
????????????excelobj.write_data(suiteid,?excelobj.casebegin+caseid,?begincol+checkid,?writestr,?NG_COLOR)??
????????????ret='NG'??
????return?ret??
??
#檢查結構體類型??
def?check_struct_item(excelobj,?suiteid,?caseid,real_struct_dict,?structlist,?structbegin,?structcount):??
????ret='OK'??
????if?structcount>1:??#傳入的是List??
????????for?structid?in?range(0,?structcount):??
????????????structdict=real_struct_dict[structid]??
????????????temp=check_item(excelobj,?suiteid,?caseid,structdict,?structlist,?structbegin+structid*len(structlist))??
????????????if?temp=='NG':??
????????????????ret='NG'??
???????????????????????
????else:?#傳入的是Dict??
????????temp=check_item(excelobj,?suiteid,?caseid,real_struct_dict,?structlist,?structbegin)??
????????if?temp=='NG':??
????????????ret='NG'??
??????????????
????return?ret??
??
#獲取異常函數(shù)及行號??
def?print_error_info():??
????"""Return?the?frame?object?for?the?caller's?stack?frame."""??
????try:??
????????raise?Exception??
????except:??
????????f?=?sys.exc_info()[2].tb_frame.f_back??
????print?(f.f_code.co_name,?f.f_lineno)????
??
#測試結果計數(shù)器,類似Switch語句實現(xiàn)??
def?countflag(flag,ok,?ng,?nt):???
????calculation??=?{'OK':lambda:[ok+1,?ng,?nt],????
?????????????????????????'NG':lambda:[ok,?ng+1,?nt],????????????????????????
?????????????????????????'NT':lambda:[ok,?ng,?nt+1]}???????
????return?calculation[flag]()???
2、項目測試代碼
#?-*-?coding:?utf-8?-*-??
#****************************************************************??
#?xxx_server_case.py??
#?Author?????:?Vince??
#?Version????:?1.0??
#?Date???????:?2011-3-10??
#?Description:?內容服務系統(tǒng)測試代碼??
#****************************************************************??
??
from?testframe?import?*??
from?common_lib?import?*??
??
httpString='http://xxx.com/xxx_product/test/'??
expectXmldir=os.getcwd()+'/TestDir/expect/'??
realXmldir=os.getcwd()+'/TestDir/real/'??
??
def?run(interface_name,?suiteid):??
????print?'【'+interface_name+'】'?+?'?Test?Begin,please?waiting...'??
????global?expectXmldir,?realXmldir??
??????
????#根據(jù)接口名分別創(chuàng)建預期結果目錄和實際結果目錄??
????expectDir=expectXmldir+interface_name??
????realDir=realXmldir+interface_name??
????if?os.path.exists(expectDir)?==?0:??
????????os.makedirs(expectDir)??
????if?os.path.exists(realDir)?==?0:??
????????os.makedirs(realDir)??
??????
????excelobj.del_testrecord(suiteid)??#清除歷史測試數(shù)據(jù)??
????casecount=excelobj.get_ncase(suiteid)?#獲取case個數(shù)??
????caseinfolist=get_caseinfo(excelobj,?suiteid)?#獲取Case基本信息??
??????
????#遍歷執(zhí)行case??
????for?caseid?in?range(0,?casecount):??
????????#檢查是否執(zhí)行該Case??
????????if?excelobj.read_data(suiteid,excelobj.casebegin+caseid,?2)=='N':??
????????????write_result(excelobj,?suiteid,?caseid,?excelobj.resultCol,?'NT')??
????????????continue?#當前Case結束,繼續(xù)執(zhí)行下一個Case??
??????????
????????#獲取測試數(shù)據(jù)??
????????sInput=httpString+get_input(excelobj,?suiteid,?caseid,?caseinfolist)?????
????????XmlString=HTTPInvoke(com_ipport,?sInput)?????#執(zhí)行調用??
??????????
????????#獲取返回碼并比較??
????????result_code=et.fromstring(XmlString).find("result_code").text??
????????ret1=check_result(excelobj,?suiteid,?caseid,result_code,?excelobj.retCol)??
??????????
????????#保存預期結果文件??
????????expectPath=expectDir+'/'+str(caseid+1)+'.xml'??
????????#saveXmlfile(expectPath,?XmlString)??
??????????
????????#保存實際結果文件??
????????realPath=realDir+'/'+str(caseid+1)+'.xml'??
????????saveXmlfile(realPath,?XmlString)??
??????????
????????#比較預期結果和實際結果??
????????ret2=?check_xmlfile(excelobj,?suiteid,?caseid,expectPath,?realPath)??
??????????
????????#寫測試結果??
????????write_result(excelobj,?suiteid,?caseid,?excelobj.resultCol,?ret1,?ret2)??
????print?'【'+interface_name+'】'?+?'?Test?End!'??
3、測試入口文章來源:http://www.zghlxwxcb.cn/news/detail-694624.html
#?-*-?coding:?utf-8?-*-??
#****************************************************************??
#?main.py??
#?Author?????:?Vince??
#?Version????:?1.0??
#?Date???????:?2011-3-16??
#?Description:?測試組裝,用例執(zhí)行入口??
#****************************************************************??
??
from?testframe?import?*??
from?xxx_server_case?import?*??
import?xxx_server_case??
??
#產品系統(tǒng)接口測試??
#設置測試環(huán)境??
xxx_server_case.excelobj=create_excel(os.getcwd()+'/TestDir/xxx_Testcase.xls')??
xxx_server_case.com_ipport=xxx.com'??
??
#Add?testsuite?begin??
run("xxx_book_list",?4)??
#Add?other?suite?from?here??
#Add?testsuite?end??
??
statisticresult(xxx_server_case.excelobj)??
xxx_server_case.excelobj.close() ?
【整整200集】超超超詳細的Python接口自動化測試進階教程合集,真實模擬企業(yè)項目實戰(zhàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-694624.html
到了這里,關于http接口自動化測試框架實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!