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

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

 

部分代码

配置文件

  1. http接口测试框架配置信息
  2. tester = tester
  3. project = A
  4. versionName = 2.2.2
  5. versionCode = 237
  6. host = a-webapi.test.b.com
  7. getTokenHost = http://a-webapi.test.b.com/api/System/GetToken
  8. loginHost = http://a-webapi.test.b.com/api/User/LoginV2
  9. loginInfo = Phone=13750199962&Password=FGgIwe5oCdk%3D
  10. SessionsPath = D:\Fiddler Sessions
  11. ApiURL = http://apihelper.b.com/Home/API/c
  12. # SpecialSessions >> 屏蔽的接口
  13. SpecialSessions = ['GetToken', 'LoginV2', 'LogOut', 'BookingV2']

启动测试入口

  1. """
  2. 运行api测试总入口
  3. """
  4. import sessions.Request
  5. def launcher_api_test():
  6. """
  7. 1.获取接口列表
  8. 2.与本地sessions对比
  9. 3.差异化文件,是否继续
  10. 3.1否 继续录制接口
  11. 3.2是 开始跑接口
  12. :return:
  13. """
  14. r = sessions.Request.Request(0) # 0 >> A 1 >> B
  15. r.start()
  16. if __name__ == "__main__":
  17. launcher_api_test()

头部、登录接口

  1. def __get_token_header(self):
  2. """
  3. 生成token头部
  4. :return:
  5. """
  6. des = self.__get_token_des()
  7. arr = (des, self.conf['systemType'], self.conf['Model'], self.conf['Release'], self.conf['DeviceId'],
  8. self.conf['versionCode'], self.conf['versionName'], self.conf['AppBuild'], self.conf['DeviceOS'], "0")
  9. authorization = self.AUTHORIZATION_TOKEN % arr
  10. headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'Authorization': authorization}
  11. response = self.session.post(self.conf['getTokenHost'], headers=headers)
  12. if json.loads(response.text)['StatsCode'] == 200:
  13. data1 = json.loads(response.text)['Data']
  14. self.time = data1['Time']
  15. self.TOKEN_NAME = data1['TokenName']
  16. self.TOKEN_VALUE = data1['TokenValue']
  17. else:
  18. print("GetToken失败,请手动检查")
  19. utils.HandleJson.HandleJson.print_json(response.text)
  20. def __login_session(self):
  21. """
  22. 调用登录接口,这样后面的接口都能正常访问了
  23. :return:
  24. """
  25. url_login = self.conf['loginHost']
  26. headers = self.__get_session_header(url_login.split('api/')[-1])
  27. data_login = r'%s' % self.conf['loginInfo']
  28. response = self.session.post(url_login, headers=headers, data=data_login)
  29. if json.loads(response.text)['StatsCode'] == 200:
  30. data1 = json.loads(response.text)['Data']
  31. self.uId = data1[self.head_uid]
  32. self.uName = data1['NickName']
  33. self.uPhone = data1['Phone']
  34. self.SessionId = data1['Sid']
  35. self.uType = data1['UserType']
  36. self.uuid = data1['UID']
  37. else:
  38. print("登录失败,请手动检查")
  39. utils.HandleJson.HandleJson.print_json(response.text)

接口片段

  1. Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
  2. Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
  3. Host: a-webapi.test.b.com
  4. Accept: text/json
  5. 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"
  6. Content-Type: application/x-www-form-urlencoded; charset=utf-8
  7. Content-Length: 21
  8. Connection: Keep-Alive
  9. Accept-Encoding: gzip
  10. User-Agent: okhttp/3.0.1
  11. Request body: CircleId=6418&IsAdd=1
  12. Response code: 200
  13. Response body: {"StatsCode":200,"Message":"收藏成功","Data":null,"Other":null}
  14. Session end
  15. Request url: a-webapi.test.b.com/api/Circle/AddCancelCollectCircle
  16. Request header: POST /api/Circle/AddCancelCollectCircle HTTP/1.1
  17. Host: a-webapi.test.b.com
  18. Accept: text/json
  19. 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"
  20. Content-Type: application/x-www-form-urlencoded; charset=utf-8
  21. Content-Length: 21
  22. Connection: Keep-Alive
  23. Accept-Encoding: gzip
  24. User-Agent: okhttp/3.0.1
  25. Request body: CircleId=6418&IsAdd=0
  26. Response code: 200
  27. Response body: {"StatsCode":200,"Message":"取消收藏成功","Data":null,"Other":null}
  28. 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 自定义信息


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

GitHub

框架地址

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

  1. Python + request + unittest实现接口测试框架

    1.为什么要写代码实现接口自动化 大家知道很多接口测试工具可以实现对接口的测试,如postman.jmeter.fiddler等等,而且使用方便,那么为什么还要写代码实现接口自动化呢?工具虽然方便,但 ...

  2. python做一个http接口测试框架

    目录结构 project case#测试用例 suite#测试目录 logs#测试日志 papi#测试类 result#测试结果 setting.py#配置文件 1.日志类,用于测试时日志记录 pya ...

  3. 【转】python做一个http接口测试框架

    出处: https://my.oschina.net/bysu/blog/751634 https://my.oschina.net/u/3041656/blog/820023

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

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  5. 初探接口测试框架--python系列3

    点击标题下「微信」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是我们期 ...

  6. 初探接口测试框架--python系列4

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

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

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  8. 初探接口测试框架--python系列6

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  9. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

随机推荐

  1. Windows及Linux环境搭建Redis集群

    一.Windows环境搭建Redis集群 参考资料:Windows 环境搭建Redis集群 二.Linux环境搭建Redis集群 参考资料:Redis Cluster的搭建与部署,实现redis的分布 ...

  2. asp页面无法访问,可尝试开始SQL Server等服务

    存在问题 asp页面的英文提示,翻译后为: "一个错误发生在服务器在处理URL.请联系系统管理员(管理人).如果您是系统管理员,请点击这里了解更多关于这个错误."   解决方案 请 ...

  3. Unity runtime性能分析器

    一. Profiler: 1. CPU Usage A. WaitForTargetFPS: Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间 B. Overhead: Profiler总体 ...

  4. DaemonSet 典型应用场景【转】

    Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本.DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本. DaemonS ...

  5. linux必会命令-查询-tail

    先说一个tail使用的例子: tail -n 20 filename 说明:显示filename最后20行. Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最 ...

  6. FZOJβ #31.字符串

    http://1572m36l09.iask.in:30808/problem/31 首先转化为保留尽量少的段使得字典序最大.考虑逐字符确定,显然我们可以将相同的连续字符缩在一起.注意到字典序最大的字 ...

  7. AddDbContext was called with configuration, but the context type 'NewsContext' only declares a parameterless constructor?

    问题 An error occurred while starting the application. ArgumentException: AddDbContext was called with ...

  8. jQuery向界面输出时保留两位小数

    通过JSTL下的<fmt:formatNumber>标签实现,具体实现代码如下: <%@ taglib uri="http://java.sun.com/jsp/jstl/ ...

  9. comboBox 下拉宽度自适应

    ///适用combobox绑定datatable private void comboBox_DataSourceChanged(object sender, EventArgs e) { Combo ...

  10. SwaggerUI日常使用

    最近公司项目集成springFox,记录一些swaggerUI日常使用,包括数组,文件,默认值,允许值,参数/结果类注解,响应码..等等. 一.参数注解: 单参数:@ApiImplicitParam ...