python接口测试浅谈

我从工作后接触接口自动化后,就一直在用phpunit编写自动化测试用例,个人感觉在接口调用和对结果的判断上,还是挺方便的。而且以前用过phpCI框架开发接口测试工具,方便快捷,和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 Posturl为接口调用地址,getparams,postparams参数根据接口调用方法的不同,分别传值或是空。

(3)函数体内为对参数的不同处理,以及根据不同的调用类型来分别调用接口。

(4)jsdata=json.loads(result)为对接口返回值做json解码,这样方便我们对结果进行判断。

(5)APIGetAdList(unittest.TestCase)为具体的测试用例类,其实这两个类应该写到两个文件中的,作为Demo,我就写到一起了。在这个类中对接口进行具体的调用,然后根据返回结果,对测试用例置成功或是失败。

(6)最后调用unittest执行测试用例。根据执行情况,输出具体的结果。由于篇幅原因,我们不可能对实例进行一句一句的讲解,如有不明白的地方,请自行查阅。

二,    利用requests模块

requestspython的一个HTTP客户端库,跟urlliburllib2类似,那为什么要用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 Posturl为接口调用地址,getparams,postparams参数根据接口调用方法的不同,分别传值或是空。

(3)函数体内为对参数的不同处理,以及根据不同的调用类型来分别调用接口。

(4)jsdata=json.loads(result)为对接口返回值做json解码,这样方便我们对结果进行判断。

(5)这个requests模块和上面的类似,只是调用方法不太一样,而且不需要对参数进行特殊的处理,只要传递的时候是字典类型的就可以了。

(6)APIGetAdList这个类是具体的测试类函数,作用和上面的一样,在此不做详解。

三,    自己编写框架实现

这种方法我是在网上看到的,感觉也不错,自己写了个框架,用Excell文件来组织测试用例,然后读取数据进行执行。由于内容较多,我们也尊重原作者,就不在此转载了,提供地址,感觉兴趣的同学可以自己去学习一下:

http接口自动化测试框架实现:http://blog.csdn.net/vincetest/article/details/6341658

 

posted @ 2015-08-06 16:40  潜龙9527  阅读(269)  评论(0编辑  收藏  举报