[python测试框架] http接口测试框架

https://testerhome.com/topics/5631

说明

由于部分内容涉及公司机密,已用字母替换,不影响阅读

实际效果

  • 验证1000个接口平均耗时6s(看机器配置及网速)
  • 第一次投入使用,马上发现5个接口异常并且该验证过程不到30s的时间

框架的下一步

  • 目前已兼容我们公司所有app
  • response body全字段验证(含字段类型)
    • 已有思路
  • 字段变化导致2个大问题
    • 由原本int(0/1)变成了布尔型
    • 时间戳长度由10位突然变成13位
  • 尽量避免日常监控中跑接口对外网数据/用户的影响
    • 目前做法是屏蔽相关接口
    • 目前状态
    • 跑接口时创建的数据id有变化,然而删除接口还是调用老的id去删除,导致数据删除不到
    • 改进
    • 拦截创建数据的response body取出对于id
    • 拦截删除接口request body,传入上一步拦截的id

最新框架图(红色部分未完成)

部分代码

配置文件

http接口测试框架配置信息

tester = tester
project = A
versionName = 2.2.2
versionCode = 237
host = a-webapi.test.b.com
getTokenHost = http://a-webapi.test.b.com/api/System/GetToken
loginHost = http://a-webapi.test.b.com/api/User/LoginV2
loginInfo = Phone=13750199962&Password=FGgIwe5oCdk%3D
SessionsPath = D:\Fiddler Sessions
ApiURL = http://apihelper.b.com/Home/API/c
# SpecialSessions >> 屏蔽的接口
SpecialSessions = [‘GetToken‘, ‘LoginV2‘, ‘LogOut‘, ‘BookingV2‘]

启动测试入口

"""
运行api测试总入口
"""

import sessions.Request

def launcher_api_test():
    """
    1.获取接口列表
    2.与本地sessions对比
    3.差异化文件,是否继续
    3.1否 继续录制接口
    3.2是 开始跑接口
    :return:
    """
    r = sessions.Request.Request(0)  # 0 >> A    1 >> B
    r.start()

if __name__ == "__main__":
    launcher_api_test()

头部、登录接口

def __get_token_header(self):
    """
    生成token头部
    :return:
    """
    des = self.__get_token_des()
    arr = (des, self.conf[‘systemType‘], self.conf[‘Model‘], self.conf[‘Release‘], self.conf[‘DeviceId‘],
           self.conf[‘versionCode‘], self.conf[‘versionName‘], self.conf[‘AppBuild‘], self.conf[‘DeviceOS‘], "0")
    authorization = self.AUTHORIZATION_TOKEN % arr
    headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded; charset=utf-8‘, ‘Authorization‘: authorization}
    response = self.session.post(self.conf[‘getTokenHost‘], headers=headers)
    if json.loads(response.text)[‘StatsCode‘] == 200:
        data1 = json.loads(response.text)[‘Data‘]
        self.time = data1[‘Time‘]
        self.TOKEN_NAME = data1[‘TokenName‘]
        self.TOKEN_VALUE = data1[‘TokenValue‘]
    else:
        print("GetToken失败,请手动检查")
        utils.HandleJson.HandleJson.print_json(response.text)

def __login_session(self):
    """
    调用登录接口,这样后面的接口都能正常访问了
    :return:
    """
    url_login = self.conf[‘loginHost‘]
    headers = self.__get_session_header(url_login.split(‘api/‘)[-1])
    data_login = r‘%s‘ % self.conf[‘loginInfo‘]
    response = self.session.post(url_login, headers=headers, data=data_login)
    if json.loads(response.text)[‘StatsCode‘] == 200:
        data1 = json.loads(response.text)[‘Data‘]
        self.uId = data1[self.head_uid]
        self.uName = data1[‘NickName‘]
        self.uPhone = data1[‘Phone‘]
        self.SessionId = data1[‘Sid‘]
        self.uType = data1[‘UserType‘]
        self.uuid = data1[‘UID‘]
    else:
        print("登录失败,请手动检查")
        utils.HandleJson.HandleJson.print_json(response.text)

接口片段

Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:19",SystemType="2",u="Circle/AddCancelCollectCircle",r="59e93eb1a6625adc6bff5ede5945a2f7",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1

Request body: CircleId=6418&IsAdd=1
Response code: 200
Response body: {"StatsCode":200,"Message":"收藏成功","Data":null,"Other":null}
Session end

Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
Host: a-webapi.test.b.com
Accept: text/json
Authorization: Digest t="2016-08-04 16:41:22",SystemType="2",u="Circle/AddCancelCollectCircle",r="26dcb55ee9ac79995c21656517c455e8",DeviceId="ffffffff-8416-49fe-3fdc-6ee400000000",Model="SM-N9100",DeviceOS="22",Release="5.1.1",VersionName="2.2.2",VersionCode="239",PushToken="",uId="3353",uName="123456ejz",uPhone="13750199962",SessionId="%2FZhckUf9%2Fd2soQZhYofjN021SdWUpLv0aW%2F3CJBr71vtOl1YHJda6J8p6P1hsQS0P3kqirm%2BtPs%3D",uType="1",bDChannelId="",bDUserId="",AppBuild="239",uUID="2255"
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 21
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.0.1

Request body: CircleId=6418&IsAdd=0
Response code: 200
Response body: {"StatsCode":200,"Message":"取消收藏成功","Data":null,"Other":null}
Session end

接口列表

你需要做的

  • 环境配置

    • Python 3.x
    • fiddler一枚(配置抓取手机请求)
    • PyCharm
  • token/session替换
    • 替换成你们项目对应的token等
    • 修改配置文件
    • 修改response body json 判断逻辑
  • 替换fiddler js
    • 项目根目录的fiddler js整个文件内容替换fiddler的js
    • 打开fiddler的Customize Rules功能
    • 删除所有内容,并把fiddler js内容全部拷贝进去
    • 修改拦截的host等信息
    • fiddler保存请求

fiddler js 自定义信息


//自定义参数设置
public static var filterUrl = "a-webapi.test.b.com";
public static var filePath = "D:\\Fiddler Sessions\\Api\\";
public static var filePathForRequested = "D:\\Fiddler Sessions\\Requested.txt";
public static var filePathForErrorResponse = "D:\\Fiddler Sessions\\ErrorResponse.txt";
public static var filePathForVerifyRequset = "D:\\Fiddler Sessions\\VerifyRequset.txt";
public static var filePathForRemoveSession = "D:\\Fiddler Sessions\\RemoveSession.txt";
public static var filePathForAddSession = "D:\\Fiddler Sessions\\AddSession.txt";
  • github拉取代码
  • 欢迎一起交流

GitHub

框架地址

时间: 2024-10-21 03:21:40

[python测试框架] http接口测试框架的相关文章

python做一个http接口测试框架

目录结构 project case#测试用例 suite#测试目录 logs#测试日志 papi#测试类 result#测试结果 setting.py#配置文件 1.日志类,用于测试时日志记录 pyapilog.py 1 # -*-coding:utf-8 -*- 2 # !/usr/bin/python 3 __author__ = 'dongjie' 4 __data__ = '2015-05-20' 5 6 import logging 7 import datetime 8 import

初探接口测试框架--python系列7

点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期待的方向,有更多兴趣的欢迎切磋,我们微信订阅号,联系方式如下: 更多书籍,敬请期待 背景说明 python系列课程也有段时间了,我们坚持,一步步来,今天是最后一课的分享,看看接口测试框架的神秘,小怪带领着大家一起完成第7课,希望能看完知识点,自己动手练习,然后和给出的例子代码对比,最后看看作业

http接口测试框架-python

简单分解一下 接口测试框架设计: 主入口 -> 遍历接口/用例 -> 发送请求+接收响应 ->结果的对比 -> 生成报告 ->发送email 分成几大类:主入口的py文件 src-核心代码文件    遍历case,发送请求和接收响应 存放case的    2.数据库里维护    3.excel里维护        包括的字段:编号,接口名称,地址前缀,请求地址,请求方法,请求数据类型,请        求数据,检查点,是否运行,测试结果,响应参数 公共函数:被多次重复调用,且

基于Python的接口测试框架实例

文章来源:http://www.jb51.net/article/96481.htm 下面小编就为大家带来一篇基于Python的接口测试框架实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 背景 最近公司在做消息推送,那么自然就会产生很多接口,测试的过程中需要调用接口,我就突然觉得是不是可以自己写一个测试框架? 说干就干,由于现有的接口测试工具Jmeter.SoupUI等学习周期有点长,干脆自己写一个吧,不求人,所有功能自己都能一清二楚. 当然,写工具造轮子只是

初探接口测试框架--python系列1

点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期待的方向,有更多兴趣的欢迎切磋,我们微信订阅号,联系方式如下: 更多书籍,敬请期待 背景说明 我们清楚的知道自动化测试包含UI自动化.接口自动化.单元自动化,其中接口自动化测试可以说是性价比比较高的,我们今天不讲如何开展接口自动化测试,而是来看看接口测试框架的神秘.小怪带领着大家一起简单轻松的

Python接口测试实战4(上) - 接口测试框架实战

如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战2 - 使用Python发送请求 Python接口测试实战3(上)- Python操作数据库 Python接口测试实战3(下)- unittest测试框架 Python接口测试实战4(上) - 接口测试框架实战 Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

Python测试框架之unittest和pytest

目前搜狗商城接口测试框架用的是unittest+HTMLTestRunner,case数有1097条,目前运行一次自动化测试,时长约为30分钟,期望控制在10分钟或者更短的时间内.近期打算重新优化框架,着重解决运行效率低的问题.最近调研了一下另一种主流测试框架Pytest,Pytest是一个非常成熟的全功能的Python测试框架,本文主要对比了Unittest和Pytest这两种较为流行的Python测试框架. 一.Unittest Unittest是Python标准库中自带的单元测试框架,Un

转 python测试框架最全资源汇总

转自: http://www.testclass.net/list/python_list_1/ xUnit frameworks(单元测试框架) frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Python 2.7以及后续版本 pytest - 成熟且功能强大的单元测试框架 plugincompat - pytest的执行及兼容性插件 nosetests - 让python测试更容易一点 slash 

python测试框架&&数据生成&&工具最全资源汇总

xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库,开箱即用unittest2 - 加强版的单元测试框架,适用于Python 2.7以及后续版本pytest - 成熟且功能强大的单元测试框架plugincompat - pytest的执行及兼容性插件nosetests - 让python测试更容易一点slash - python实现的单元测试框架 extensions 扩展proboscis - 仿TestNG扩展了unit