我从工作后接触接口自动化后,就一直在用phpunit编写自动化测试用例,个人感觉在接口调用和对结果的判断上,还是挺方便的。而且以前用过php的CI框架开发接口测试工具,方便快捷,和phpunit调用接口接合的比较好。最近学习了一下python的接口测试,发现也挺好用的,就总结一下,希望对想学习用python做接口自动化的同学有所帮助。
一,
利用urllib,urllib2模块
Python可以利用这两个模块完成对接口的操作,不过写一个完整的接口自动化测试用例,还需要有丰富的Assert语句来支持,所以我们还要引用另外一个模块unittest。至于模块如何安装,请自行查询,本处不在讲解,我们直接上代码实例:
#!/usr/bin/env
python
# -*- coding: utf_8 -*-
import urllib2,urllib
import json
import unittest, time,
re
class APITest():
"""
接口测试类
"""
def apicall(self,method,url,getparams,postparams):
str1=""
#GET方法调用
if method=="GET":
if getparams!="":
for k in getparams:
str1=str1+k+"="+urllib2.quote(str(getparams.get(k)))
if len(getparams)>2:
str1=str1+"&"
url=url+"&"+str1;
result = urllib2.urlopen(url).read()
#POST方法调用
if method=="POST":
if postparams!="":
data = urllib.urlencode(postparams)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
result = response.read()
jsdata=json.loads(result)
return jsdata
class APIGetAdList(unittest.TestCase):
def test_call(self):
api=APITest()
getparams={"keyword":"测试"}
postparams=""
data=api.apicall("GET","http://api.zhongchou.cn/deal/list?v=1",getparams,postparams)
print data
if(data["errno"]!=""):
self.assertEqual(0, data["errno"])
print "接口
deal/list
------------OK!"
else:
print "接口
deal/list
------------Failure!"
self.assertEqual(0, data["errno"])
if __name__ == "__main__":
unittest.main()
代码讲解:
(1)定义通用的接口调用类APITest,接口调用函数apicall().
(2)在接口调用函数中,我们通过method参数来区分接口的调用类型Get or Post,url为接口调用地址,getparams,postparams参数根据接口调用方法的不同,分别传值或是空。
(3)函数体内为对参数的不同处理,以及根据不同的调用类型来分别调用接口。
(4)jsdata=json.loads(result)为对接口返回值做json解码,这样方便我们对结果进行判断。
(5)APIGetAdList(unittest.TestCase)为具体的测试用例类,其实这两个类应该写到两个文件中的,作为Demo,我就写到一起了。在这个类中对接口进行具体的调用,然后根据返回结果,对测试用例置成功或是失败。
(6)最后调用unittest执行测试用例。根据执行情况,输出具体的结果。由于篇幅原因,我们不可能对实例进行一句一句的讲解,如有不明白的地方,请自行查阅。
二,
利用requests模块
requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的:
python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。
于是我也尝试了一下,发现还挺好用的,而且网上也有很多相关的教程,我们也不做太多详细的讲解。
实例:
#!/usr/bin/env
python
# -*- coding: utf_8 -*-
import requests
import unittest
import json
class CallApi():
def apicall(self,method,url,getparams,postparams):
result=""
if method=="GET":
if getparams!="":
result=requests.get(url,getparams)
else:
result=requests.get(url)
if method=="POST":
if postparams!="":
result=requests.post(url,postparams)
jsdata=json.loads(result.text)
return jsdata
class APIGetAdList(unittest.TestCase):
def test_call(self):
api=CallApi()
getparams=""
postparams=""
data=api.apicall("GET","http://api.zhongchou.cn/index/getadlist?v=1", getparams,
postparams)
if(data["errno"]!=""):
self.assertEqual(0, data["errno"])
print "接口
index/getadlist------------OK!"
else:
print "接口
index/getadlist------------Failure!"
self.assertEqual(0, data["errno"])
if __name__ == "__main__":
unittest.main()
代码讲解:
(1)CallApi类为调用接口通用类,apicall为具体的调用函数。
(2)在接口调用函数中,我们通过method参数来区分接口的调用类型Get or Post,url为接口调用地址,getparams,postparams参数根据接口调用方法的不同,分别传值或是空。
(3)函数体内为对参数的不同处理,以及根据不同的调用类型来分别调用接口。
(4)jsdata=json.loads(result)为对接口返回值做json解码,这样方便我们对结果进行判断。
(5)这个requests模块和上面的类似,只是调用方法不太一样,而且不需要对参数进行特殊的处理,只要传递的时候是字典类型的就可以了。
(6)APIGetAdList这个类是具体的测试类函数,作用和上面的一样,在此不做详解。
三,
自己编写框架实现
这种方法我是在网上看到的,感觉也不错,自己写了个框架,用Excell文件来组织测试用例,然后读取数据进行执行。由于内容较多,我们也尊重原作者,就不在此转载了,提供地址,感觉兴趣的同学可以自己去学习一下: