Python 基于http接口自动化测试
设计原理 基于http协议接口的测试设计,莫过于Python的requests库,简单粗暴易理解。
设计模式 采用python的flask框架,搭建一套接口自动化测试平台。 测试用例维护:采用Excel 测试结果保存:采用MongoDb存储,HTML页面展示
相关核心代码介绍:
- Excel模板如下:
看Excel的定义命名,基本理解,每个参数的含义 介绍: B1:要测试的接口地址 B2:该测试接口的请求参数,以“#”分隔【便于分割】 B3:登录的URL,若测试不需要登录 B4:登录的json串,以字典的形式展现 注:CaseNo、Except——result、Commit,是必填的 - 从Excel读取及处理数据,代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
importxlrdimportos# ****************************************************************# Excel模版设置# self.interFace = 0 #Excel中测试用例接口对应为第1列# self.interFaceArgList = 1 #Excel中测试用例接口参数列表对应为第2列# self.loginChoice = 2 #Excel中测试用例接口是否需要登录为第3列# self.loginJson = 3 #Excel中测试用例接口是否需要登录为第4列# self.titleIndex = 4 #Excel中测试用例标题行索引为第5列# self.caseBegin = 5 #Excel中测试用例开始行索引为第6列# ****************************************************************classExcelSheet:def__init__(self, sFile, interFace=0, interFaceArgList=1, loginInterFace=2, loginJson=3, titleIndex=4, caseBegin=5):try:excel=xlrd.open_workbook(sFile)exceptException as e:printeexit()self.sheet=excel.sheet_by_index(0)# 查询Excel的第一个sheetself.interFace=interFaceself.interFaceArgList=interFaceArgListself.loginInterFace=loginInterFaceself.titleIndex=titleIndexself.caseBegin=caseBeginself.loginJson=loginJsondefsheet_name(self):returnself.sheets.namedefnrows(self):returnself.sheet.nrowsdefncols(self):returnself.sheet.ncolsdefcellxy(self, rowx, colx):# type: (object, object) -> objectcell_value=self.sheet.cell(rowx, colx).value# 对数字的处理ifself.sheet.cell(rowx, colx).ctypein(2,3)andint(cell_value)==cell_value:cell_value=int(cell_value)returncell_value# interFace 测试接口URLdefget_interFace(self):returnself.cellxy(self.interFace,1)# interFace接口的参数Listdefget_interFaceArgList(self):returnself.cellxy(self.interFaceArgList,1).split("#")# 测试用例的参数项defget_titleIndex(self):returnself.sheet.row_values(self.titleIndex)# 登录的接口地址defget_loginInterFace(self):returnself.cellxy(self.loginInterFace,1)# 获取登录接口参数的jsondefget_loginJson(self):returnstr(self.cellxy(self.loginJson,1))# 返回单行用例的数据字典defget_by_line(self, line):tempdict=dict()data=dict()ifline <self.caseBegin:returnFalseelse:forcolinrange(self.ncols()):ifself.cellxy(self.titleIndex, col)inself.get_interFaceArgList():ifself.cellxy(line, col) !='X':data[self.cellxy(self.titleIndex, col)]=self.cellxy(line, col)else:tempdict[self.cellxy(self.titleIndex, col)]=self.cellxy(line, col)tempdict["data"]=datareturntempdict -
requests的post和get请求代码:
123456789101112131415importrequestsdefpostRequest(url, data, cookie):header={"Content-Type":"application/json"}ifcookie:returnrequests.post(url, data=data, cookies=cookie, headers=header)else:returnrequests.post(url, data=data, headers=header)defpostRequest(url, cookie):header={"Content-Type":"application/json"}ifcookie:returnrequests.get(url, cookies=cookie, headers=header)else:returnrequests.get(url, headers=header) - 检查返回为页面还是json串:
1234567
defcheckReturnResult(req_result):try:realResult=eval(req_result)except:returnFalseelse:returnreq_result - 测试结果存储MongoDB:
1234567891011121314151617181920
# -*- coding: utf-8 -*-importpymongoclassConMongoDb:#读取配置文件def__init__(self):MongoIP="192.168.X.XXX"MongoPort=27017#链接MongoDbself.conn=pymongo.Connection(MongoIP, MongoPort)#选择数据库self.db=self.conn.testself.collection=self.db.SocketTest'''# **************************************************# InsertMongo:往MongoDb插入数据# **************************************************'''defInsertMongo(self, Lst):self.collection.insert(Lst)def close(self): return self.conn.disconnect()
- 测试用例执行代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
importtimeExcelSheet=ExcelSheet("104137PC.xlsx")interFace=ExcelSheet.get_interFace()interFaceArgList=ExcelSheet.get_interFaceArgList()titleIndex=ExcelSheet.get_titleIndex()loginInterFace=ExcelSheet.get_loginInterFace()# 判断是否需要登录ifloginInterFace:if"username"notintitleIndexor"password"notintitleIndex:print"Test Case File not include username or password"exit()else:# 获取登录接口参数的jsonloginJson=ExcelSheet.get_loginJson()caseList=list()forlineinrange(5, ExcelSheet.nrows()):lineContent=ExcelSheet.get_by_line(line)# 获取登录后的cookieifloginInterFace:# 需要登录,用户名密码,替换loginJson=loginJson.replace("#username#", lineContent["username"])loginJson=loginJson.replace("#password#",str(lineContent["password"]))result=postRequest(loginInterFace,eval(loginJson),False)printresult.textcookie=result.cookieselse:cookie=False# reqtype 不填默认postiflineContent.has_key("reqtype"):iflineContent["reqtype"].upper()=="POST":interFaceResult=postRequest(interFace, lineContent["data"], cookie)else:interFaceResult=postRequest(interFace, cookie)else:interFaceResult=postRequest(interFace, lineContent["data"], cookie)req_result=interFaceResult.text# 非页面,可直接比较,也可以转换成字典进行某个value进行比较ifcheckReturnResult(req_result):ifcheckReturnResult(req_result)==lineContent["Except_result"]:TestResult="PASS"else:TestResult="FAIL"#如果返回是页面的话,就查找特殊标志词else:ifineContent["Except_result"]inreq_result:TestResult="PASS"else:TestResult="FAIL"lineContent["result"]=TestResultcaseList.append(lineContent)TestDate=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))content={"interFace": interFace,"caseList": caseList,"testdate": TestDate}MyngoCls=ConMongoDb()MyngoCls.InsertMongo(content)MyngoCls.close()
整个流程梳理:
- 用例Excel的读取解析
- python的requests模块运用
- 返回值的判断处理
- 用例执行结果的存储
- 用例测试的入口
看Excel的定义命名,基本理解,每个参数的含义 介绍: B1:要测试的接口地址 B2:该测试接口的请求参数,以“#”分隔【便于分割】 B3:登录的URL,若测试不需要登录 B4:登录的json串,以字典的形式展现 注:CaseNo、Except——result、Commit,是必填的
浙公网安备 33010602011771号