用Python Requests类来实现接口测试

发表于:2017-4-21 11:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:顾翔    来源:51Testing软件测试网原创

  上面这幅图是Main Cohn提出的软件分层测试架构图。大家都知道我们以前的测试都是基于UI测试的,但是UI 界面经常变化,给测试代码的维护带来了很大的影响。目前基于接口的测试越来越突出,由于许多性能测试工具,比如:LoadRunnerJmeter工作在网络接口层的,所以用这类工具进行接口测试是普遍的。在这里我通过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内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

相关推荐:
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • 扇飘零
    2017-4-21 12:01:01

    厉害了我的哥~~~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号