• 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

     

  • 相关阅读:
    GPS时钟参考源(GPS同步时钟)电力系统探讨
    GPS对时系统(时间同步系统)建设才是电力基础
    NTP授时服务器(NTP时钟服务器)基本原理介绍
    NTP授时服务器(北斗授时产品)在广播电视系统里的应用
    GPS北斗授时设备共视对比及传输链路接口
    基于NTP时钟服务器的时间同步数据采集系统
    利用GPS或北斗卫星开发的一款NTP授时服务器
    GPS时钟系统(卫星时钟同步)才是智能变电站的基础建设
    PTP精密时钟服务器IEEE1588(V2.0)协议浅析
    电子时钟显示屏,时间同步显示,GPS时钟系统
  • 原文地址:https://www.cnblogs.com/eagleking0318/p/6520787.html
Copyright © 2020-2023  润新知