• python+requests+unittest API接口测试


    点点在网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,将用例维护在文本或表格中,而没有说明怎么样去生成想要的用例,

    问题:

    测试接口时,比如参数a,b,c,我要先测a参数,有(不传,为空,整形,浮点,字符串,object,过短,超长,sql注入)这些情况,其中一种情况就是一条用例,同时要保证b,c的正确,确保a的测试不受b,c参数的错误影响

    解决思路:

    符合接口规范的参数可以手动去填写,或者准备在代码库中。那些不符合规范的参数(不传,为空,整形,浮点,字符串,object,过短,超长,sql注入)也可以准备在库中作为常量反复使用

    主要实现的功能点:

    1.api参数整理到dict中,方便组合参数生成用例

    2.对生成的用例进行循环执行

    3.封装些许代码便于使用和维护

    源码分析:

    canshuxinxi.py文件用来存放api接口信息。以dict形式存放,这样就可以API_ALL['登录接口'][url]这种方式去取,看起来较直观,知道取得是哪个接口的那部分信息。

     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-06-09 14:09
     4 # canshuxinxi.py
     5 
     6 # 接口信息
     7 API_ALL = {
     8             '登录接口': {
     9                             'number': '1',
    10                             'url': 'http://www.baidu.com',
    11                             'leixing': 'post',
    12                             'head': {
    13                                         'aa': 'bb',
    14                                         'cc': 'dd',
    15                                         },
    16                             'canshu': {
    17                                         'username': 'Wbfxs001',
    18                                         'password': '111111Qq',
    19                                         'grant_type': 'password',
    20                                     },
    21                             'qiwang': {
    22                                         'code': 200,
    23                                         'name': 'Wbfxs001',
    24                                         },
    25                         },
    26 
    27             '退出接口': {
    28                             'number': '1',
    29                             'url': 'http://www.baidu.com',
    30                             'leixing': 'get',
    31                             'canshu': {
    32                                         'username': 'Wbfxs001',
    33                                         'password': '111111Qq',
    34                                         'grant_type': 'password',
    35                                       }
    36             }
    37 }

    changliang.py文件用来存非常规(可能会让接口响应异常)参数,同理也是存放在dict中,方便维护,比如以后要加新的sql注入代码段,可以直接在后面添加

     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-06-09 14:09
     4 # changliang.py
     5 
     6 # 常用参数不传,为空,整形,浮点,字符串,object,过短,超长,sql注入
     7 objects1 = 'xxxx'
     8 objects2 = 'ssss'
     9 
    10 ZHCS = {
    11             '为空': [''],
    12             '整形': [10, 23, 44, 88, 99],
    13             '浮点': [1.11, 2.342, -1.03],
    14             '字符串': ['aaaa', 'bbbb', 'cccc','dddd'],
    15             'object': [objects1, objects2],
    16             '过短': ['1', '0'],
    17             '超长': ['11111111111111111111111111111111111111111111111'],
    18             'sql注入': [';and 1=1 ;and 1=2', ";and (select count(*) from sysobjects)>0 mssql", ";and 1=(select IS_SRVROLEMEMBER('sysadmin'));--"],
    19          }
    # gongju.py作为工具类,下面方法进行了封装,方便调用。实现了对参数进行组合,生产不同组合的dict类型的参数,并将dict参数保存到list中,方便取用。
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-06-09 14:11
     4 # gongju.py
     5 
     6 # 生成不同组合的参数
     7 
     8 class gj():
     9 
    10     def listalls(self, csTrue,  csFalse):
    11         fzgcs = []  # 得到cycanshu的key,将所有非正规参数放在一个list中
    12         listall = []  # 保存参数dict 为 list
    13         zhcs = dict(csTrue)
    14         listall.append(csTrue)
    15         aaa = list(csFalse.keys())
    16         for i in aaa:
    17             bbb = csFalse[i]  # 得到具体参数list
    18             for k in bbb:
    19                 fzgcs.append(k)  # 便利每一个参数加入fzgcs列表
    20 
    21         zhcskey = list(zhcs.keys())  # 拿到将要进行组合的参数
    22         for i in zhcskey:
    23             a = zhcs[i]  # 保留原有的参数值,下面替换完后复原正确参数
    24             for k in fzgcs:
    25                 zhcs[i] = k
    26                 listall.append(str(zhcs))
    27             # 循环完后复原正确参数
    28             zhcs[i] = a
    29         return listall
    jiaoben.py文件作为脚本类,用来对组合好的参数进行循环执行,依次带入组合参数请求。(只做了请求和打印响应信息,可再加入对响应结果断言)
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-06-09 14:22
     4 # jiaoben.py
     5 
     6 from changliang import ZHCS
     7 from canshuxinxi import API_ALL
     8 from gongju import gj
     9 import requests
    10 # 脚本类,组合工具参数进行请求
    11 gj = gj()
    12 def jball():
    13     apikeys = API_ALL.keys()
    14     print(apikeys)
    15     for key in apikeys:
    16         apiname = key
    17         url = API_ALL[key]['url']
    18         number = API_ALL[key]['number']
    19         leixin = API_ALL[key]['leixing']
    20         canshus = gj.listalls(API_ALL[key]['canshu'], ZHCS)
    21         if leixin == 'post':
    22             print("======="+" api名称:"+apiname+"=======")
    23             for cs in canshus:
    24                 mp = requests.post(url=url, data=cs)
    25                 fhcode = str(mp.status_code)
    26                 xysj = str(mp.elapsed.microseconds)
    27                 print("=响应=api编号:"+number+"  响应code:"+fhcode+"  响应时间:"+xysj)
    28         if leixin == 'get':
    29             print("======="+" api名称:"+apiname+"=======")
    30             for cs in canshus:
    31                 mp = requests.get(url=url, data=cs)
    32                 fhcode = str(mp.status_code)
    33                 xysj = str(mp.elapsed.microseconds)
    34                 print("=响应=api编号:"+number+"  响应code:"+fhcode+"  响应时间:"+xysj)
    35 jball()
    tesone.py文件作为用例执行文件,熟悉unittest框架的都清楚其中的原理,就不做多介绍,黑熊主要用来控制脚本的执行,结合了unittest框架后,方便后续的扩展。
     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 # @Time    : 2017-06-09 8:53
     4 # tesone.py
     5 
     6 import requests
     7 import unittest
     8 import time
     9 from jiaoben import jball
    10 class testclassone(unittest.TestCase):
    11     def setUp(self):
    12         print(111)
    13         pass
    14     def test_1(self):
    15         jball()  # 执行脚本
    16         pass
    17     def tearDown(self):
    18         print(333)
    19         pass
    20 
    21 
    22 if __name__ == '__main__':
    23     unittest.main()

    最后附上用例执行后的效果图:

    结语:

    期间感谢@我去热饭  饭哥的细心指导,给予点点莫大的帮助,谢谢!

    为什么选择?

    有的人喜欢创造世界,他们做了程序员

    有的人喜欢拯救世界,他们做了测试员

  • 相关阅读:
    WinAPI: midiOutReset 重置输出设备
    WinAPI: midiOutLongMsg 向输出设备发送一条系统专用的 MIDI 消息
    WinAPI: midiInStart 启动输入
    WinAPI: midiOutClose 关闭输出设备
    WinAPI: midiInStop 停止输入
    bootstrap居中
    设计模式之访问者模式
    zend framework 开发环境搭建及入门
    转:GIT GUI使用
    Asp web.config详解
  • 原文地址:https://www.cnblogs.com/hxjxb/p/6973347.html
Copyright © 2020-2023  润新知