python+requests+unittest API接口测试实例(详解)


Posted in Python onJune 10, 2017

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

问题:

测试接口时,比如参数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]这种方式去取,看起来较直观,知道取得是哪个接口的那部分信息。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017-06-09 14:09
# canshuxinxi.py

# 接口信息
API_ALL = {
      '登录接口': {
              'number': '1',
              'url': 'http://www.baidu.com',
              'leixing': 'post',
              'head': {
                    'aa': 'bb',
                    'cc': 'dd',
                    },
              'canshu': {
                    'username': 'Wbfxs001',
                    'password': '111111Qq',
                    'grant_type': 'password',
                  },
              'qiwang': {
                    'code': 200,
                    'name': 'Wbfxs001',
                    },
            },

      '退出接口': {
              'number': '1',
              'url': 'http://www.baidu.com',
              'leixing': 'get',
              'canshu': {
                    'username': 'Wbfxs001',
                    'password': '111111Qq',
                    'grant_type': 'password',
                   }
      }
}

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017-06-09 14:09
# changliang.py

# 常用参数不传,为空,整形,浮点,字符串,object,过短,超长,sql注入
objects1 = 'xxxx'
objects2 = 'ssss'

ZHCS = {
      '为空': [''],
      '整形': [10, 23, 44, 88, 99],
      '浮点': [1.11, 2.342, -1.03],
      '字符串': ['aaaa', 'bbbb', 'cccc','dddd'],
      'object': [objects1, objects2],
      '过短': ['1', '0'],
      '超长': ['11111111111111111111111111111111111111111111111'],
      'sql注入': [';and 1=1 ;and 1=2', ";and (select count(*) from sysobjects)>0 mssql", ";and 1=(select IS_SRVROLEMEMBER('sysadmin'));--"],
     }

# gongju.py作为工具类,下面方法进行了封装,方便调用。实现了对参数进行组合,生产不同组合的dict类型的参数,并将dict参数保存到list中,方便取用。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017-06-09 14:11
# gongju.py

# 生成不同组合的参数

class gj():

  def listalls(self, csTrue, csFalse):
    fzgcs = [] # 得到cycanshu的key,将所有非正规参数放在一个list中
    listall = [] # 保存参数dict 为 list
    zhcs = dict(csTrue)
    listall.append(csTrue)
    aaa = list(csFalse.keys())
    for i in aaa:
      bbb = csFalse[i] # 得到具体参数list
      for k in bbb:
        fzgcs.append(k) # 便利每一个参数加入fzgcs列表

    zhcskey = list(zhcs.keys()) # 拿到将要进行组合的参数
    for i in zhcskey:
      a = zhcs[i] # 保留原有的参数值,下面替换完后复原正确参数
      for k in fzgcs:
        zhcs[i] = k
        listall.append(str(zhcs))
      # 循环完后复原正确参数
      zhcs[i] = a
    return listall

jiaoben.py文件作为脚本类,用来对组合好的参数进行循环执行,依次带入组合参数请求。(只做了请求和打印响应信息,可再加入对响应结果断言)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017-06-09 14:22
# jiaoben.py

from changliang import ZHCS
from canshuxinxi import API_ALL
from gongju import gj
import requests
# 脚本类,组合工具参数进行请求
gj = gj()
def jball():
  apikeys = API_ALL.keys()
  print(apikeys)
  for key in apikeys:
    apiname = key
    url = API_ALL[key]['url']
    number = API_ALL[key]['number']
    leixin = API_ALL[key]['leixing']
    canshus = gj.listalls(API_ALL[key]['canshu'], ZHCS)
    if leixin == 'post':
      print("======="+" api名称:"+apiname+"=======")
      for cs in canshus:
        mp = requests.post(url=url, data=cs)
        fhcode = str(mp.status_code)
        xysj = str(mp.elapsed.microseconds)
        print("=响应=api编号:"+number+" 响应code:"+fhcode+" 响应时间:"+xysj)
    if leixin == 'get':
      print("======="+" api名称:"+apiname+"=======")
      for cs in canshus:
        mp = requests.get(url=url, data=cs)
        fhcode = str(mp.status_code)
        xysj = str(mp.elapsed.microseconds)
        print("=响应=api编号:"+number+" 响应code:"+fhcode+" 响应时间:"+xysj)
jball()

tesone.py文件作为用例执行文件,熟悉unittest框架的都清楚其中的原理,就不做多介绍,黑熊主要用来控制脚本的执行,结合了unittest框架后,方便后续的扩展。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017-06-09 8:53
# tesone.py

import requests
import unittest
import time
from jiaoben import jball
class testclassone(unittest.TestCase):
  def setUp(self):
    print(111)
    pass
  def test_1(self):
    jball()# 执行脚本
    pass
  def tearDown(self):
    print(333)
    pass


if __name__ == '__main__':
  unittest.main()

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

python+requests+unittest API接口测试实例(详解)

以上这篇python+requests+unittest API接口测试实例(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python分割和拼接字符串
Nov 01 Python
python3序列化与反序列化用法实例
May 26 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
python实现对输入的密文加密
Mar 20 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
基于python实现语音录入识别代码实例
Jan 17 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
详解Python yaml模块
Sep 23 Python
基于python爬虫数据处理(详解)
Jun 10 #Python
python实现稀疏矩阵示例代码
Jun 09 #Python
Python实现数据库并行读取和写入实例
Jun 09 #Python
详解python之多进程和进程池(Processing库)
Jun 09 #Python
Python使用django搭建web开发环境
Jun 09 #Python
Python实现删除文件中含“指定内容”的行示例
Jun 09 #Python
Python实现两个list对应元素相减操作示例
Jun 09 #Python
You might like
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
js验证表单第二部分
2006/11/25 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
js简单抽奖代码
2015/01/16 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python numpy元素的区间查找方法
2018/11/14 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
市场营销专业自荐书
2014/06/10 职场文书
中秋节活动总结
2014/08/29 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
刑事案件上诉状
2015/05/23 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫