python接口测试浅谈
我从工作后接触接口自动化后,就一直在用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文件来组织测试用例,然后读取数据进行执行。由于内容较多,我们也尊重原作者,就不在此转载了,提供地址,感觉兴趣的同学可以自己去学习一下:
http接口自动化测试框架实现:http://blog.csdn.net/vincetest/article/details/6341658