上面这幅图是Main Cohn提出的软件分层测试架构图。大家都知道我们以前的测试都是基于UI测试的,但是UI 界面经常变化,给测试代码的维护带来了很大的影响。目前基于接口的测试越来越突出,由于许多性能测试工具,比如:LoadRunner、Jmeter是工作在网络接口层的,所以用这类工具进行接口测试是普遍的。在这里我通过python requests类来进行接口测试。
使用python requests首先要安装requests类,如果在你的机器上安装了pip或pip3,你可以使用>pip(3) install requests来进行安装。关于python request类的信息在网上的信息已经很多了,不是本文介绍的重点,在这里我们主要来看看我是如何使用这个类来实现基于WEB的接口自动化测试的。在我的程序里数据是放在XML文件中的,所以程序必须引入from xml.dom import minidom类。
下面让我们来看一下xml的结构:
Config.xml
<case>
<TestId>testcase001</TestId>
<Title>啄木鸟测试咨询网的测试</Title>
<Method>get</Method>
<Desc>测试啄木鸟测试咨询网</Desc>
<Url>http://www.3testing.com</Url>
<InptArg> "action": "44803","accont": "1865998xxxx","niqeid": "00D7C889-06A0-426E-BAB1-5741A1192038","title": "啄木鸟测试网","smmary": "啄木鸟测试网接口测试","message": "12345","msgtype": "25","menid": "203"</InptArg>
<Result>200</Result>
<CheckWord>iframe id="head"</CheckWord>
</case>
在这里
·<TestId>:测试用例的编号;
·<Title>:测试用例的标题;
·<Method>:请求方式,比如get,post;
·<Url>:测试的URL;
·<InptArg>:测试的参数;
·<Result>:返回码;
·<CheckWord>:返回信息的检测信息。
测试用例testcase001是啄木鸟测试培训网的基本测试功能,我们通过检查返回码是否为200以及返回信息中是否包含"iframe id="head""来判断测试用例是否通过。
下面三个测试数据如下:
<case> <TestId>testcase002</TestId> <Title>百度网首页测试</Title> <Method>get</Method> <Desc>测试百度网首页</Desc> <Url>https://www.baidu.com</Url> <InptArg>"ie": "utf-8","f": "8","rsv_bp": "0","rsv_idx": "1","tn": "baidu","wd": "%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%A%95","rsv_pq": "bf4d3a390058e1be","rsv_t": "66ef5OBahZJnF8i7ZXtHIdoystK29gJnPA9nNg6I5eJm2RhxcUHg0JngQ8Q","rqlang": "cn","rsv_enter": "1","rsv_sug3": "2","action": "44803","accont": "33446675xxxx","niqeid": "00D7C889-06A0-426E-BAB1-5741A1192038","title": "百度查询测试","smmary": "百度查询接口测试","message": 12345","msgtype": "25","menid": "203"</InptArg> <Result>200</Result> <CheckWord>input type=submit id=su</CheckWord> </case> <case> <TestId>testcase003</TestId> <Title>百度网查询参数缺少测试</Title> <Method>post</Method> <Desc>测试百度网查询后,查询内容为空,返回百度网首页</Desc> <Url>https://www.baidu.com/s</Url> <InptArg>"ie": "utf-8","f": "8","rsv_bp": "0","rsv_idx": "1","tn": "baidu","wd": "","rsv_pq": "bf4d3a390058e1be","rsv_t": "66ef5OBahZJnF8i7ZXtHIdoystK29gJnPA9nNg6I5eJm2RhxcUHg0JngQ8Q","rqlang": "cn","rsv_enter": "1","rsv_sug3": "2","action": "44803","accont": "33446675xxxx","niqeid": "00D7C889-06A0-426E-BAB1-5741A1192038","title": "百度查询测试","smmary": "百度查询接口测试","message": "12345","msgtype": "25","menid": "203"</InptArg> <Result>200</Result> <CheckWord>location.replace(location.href.replace("https://","http://"));</CheckWord> </case> <case> <TestId>testcase003</TestId> <Title>测试啄木鸟测试咨询网不存在页测试</Title> <Method>get</Method> <Desc>测试啄木鸟测试咨询网存在的网址404error测试</Desc> <Url>https://www.3testing.com/files/a.html</Url> <InptArg> ""</InptArg> <Result>404</Result> <CheckWord> </CheckWord> </case> |
测试用例testcase002是百度网首页的基本测试功能。
测试用例testcase003是百度网查询显示页没有输入内容,检查程序是否返回首页。
测试用例testcase004是啄木鸟测试培训网不存在网页的检查。
具体测试代码如下:
#!/usr/bin/env python #coding:utf-8 import json import requests import operator import os from xml.dom import minidom #发送请求 def sendData(par): payload = {} payload[0] = par[6] params = par[5] mystr=par[4] #发送请求 with open('rightside.txt','a+') as rs: try: data = requests.get(mystr,params=payload) except Exception as e: #返回代码为404时会出现异常 if operator.eq("404",par[6]): rs.write('通过\n') else: rs.write('失败\n') else: print(data.text) r=str(data.status_code) print (r) try: #非404错误检查检查返回码与检查字符串是否匹配 if ((operator.eq(r,par[6])) and (par[7]) in data.text): rs.write('通过\n') else: rs.write('失败\n') except Exception as e: rs.write('没有执行结果\n') rs.close() #产生HTML报告 def report(par,line): mystr="<tr>" mystr=mystr+"<td>"+par[0]+"</td>\n" mystr=mystr+"<td>"+par[1]+"</td>\n" mystr=mystr+"<td>"+par[2]+"</td>\n" mystr=mystr+"<td>"+par[3]+"</td>\n" mystr=mystr+"<td>"+par[4]+"</td>\n" mystr=mystr+"<td>"+par[5]+"</td>\n" mystr=mystr+"<td>"+par[6]+"</td>\n" mystr=mystr+"<td>"+par[7]+"</td>\n" mystr=mystr+"<td>"+line+"</td>\n" mystr=mystr+"</tr>\n" return mystr #获得参数 def getpar(): par = [] par.append(TestIds[i].firstChild.data) par.append(Titles[i].firstChild.data) par.append(Methods[i].firstChild.data) par.append(Descs[i].firstChild.data) par.append(Urls[i].firstChild.data) par.append(InptArgs[i].firstChild.data) par.append(Results[i].firstChild.data) par.append(CheckWords[i].firstChild.data) return par #主程序 if __name__=="__main__": dom = minidom.parse('config.xml') root = dom.documentElement #获取xml信息 TestIds = root.getElementsByTagName('TestId') Titles = root.getElementsByTagName('Title') Methods = root.getElementsByTagName('Method') Descs = root.getElementsByTagName('Desc') Urls = root.getElementsByTagName('Url') InptArgs = root.getElementsByTagName('InptArg') Results = root.getElementsByTagName('Result') CheckWords =root.getElementsByTagName('CheckWord') i=0 #逐个进行测试,测试结果临时放在rightside.txt文件中 with open('rightside.txt','w') as rs: for TestId in TestIds: par = getpar() sendData(par) i=i+1 rs.close() frs = open("rightside.txt","r") lines="" i=0 for TestId in TestIds: line=frs.readline() par = getpar() lines=lines+report(par,line) i=i+1 frs.close() #通过模板htm文件生成 WEB测试报告 fhtml = open("index.htm","r") myline=fhtml.read() myline=myline.replace('###1',lines) fhtml.close() with open('report.html','w') as fhtml1: fhtml1.write(myline) fhtml1.close() |
下图是最后的测试报告图:
版权声明:本文出自《51测试天地》原创测试文章系列(四十五)投稿。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
相关推荐: