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 and、or以及and-or语法总结
Apr 14 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
Jun 20 Python
python放大图片和画方格实现算法
Mar 30 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
Python统计时间内的并发数代码实例
Dec 28 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
python re模块和正则表达式
Mar 24 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
基于Zend的Captcha机制的应用
2013/05/02 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
JScript的条件编译
2007/05/29 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
python实现批量下载新浪博客的方法
2015/06/15 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
python日志logging模块使用方法分析
2019/05/23 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
银行实习人员自我鉴定
2013/09/22 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
清扬洗发水广告词
2014/03/14 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
大学生暑期实践报告
2015/07/13 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android