Jmeter使用基础笔记-写一个http请求
前言
本篇文章主要讲述2个部分:
- 搭建一个简单的测试环境
- 用Jmeter发送一个简单的http请求
搭建测试环境
- 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保存为
api_server.py
:import hashlib import hmac import json from functools import wrapsfrom flask import Flask, make_response, request from httprunner.built_in import gen_random_stringtry:from httpbin import app as httpbin_appHTTPBIN_HOST = "127.0.0.1"HTTPBIN_PORT = 3458HTTPBIN_SERVER = "http://{}:{}".format(HTTPBIN_HOST, HTTPBIN_PORT) except ImportError:httpbin_app = NoneHTTPBIN_HOST = "httpbin.org"HTTPBIN_PORT = 443HTTPBIN_SERVER = "https://{}:{}".format(HTTPBIN_HOST, HTTPBIN_PORT)FLASK_APP_PORT = 5000 SECRET_KEY = "DebugTalk"app = Flask(__name__)""" storage all users' data data structure:users_dict = {'uid1': {'name': 'name1','password': 'pwd1'},'uid2': {'name': 'name2','password': 'pwd2'}} """ users_dict = {}""" storage all token data data structure:token_dict = {'device_sn1': 'token1','device_sn2': 'token1'} """ token_dict = {}def get_sign(*args):content = ''.join(args).encode('ascii')sign_key = SECRET_KEY.encode('ascii')sign = hmac.new(sign_key, content, hashlib.sha1).hexdigest()return signdef gen_md5(*args):return hashlib.md5("".join(args).encode('utf-8')).hexdigest()def validate_request(func):@wraps(func)def wrapper(*args, **kwargs):device_sn = request.headers.get('device_sn', "")token = request.headers.get('token', "")if not device_sn or not token:result = {'success': False,'msg': "device_sn or token is null."}response = make_response(json.dumps(result), 401)response.headers["Content-Type"] = "application/json"return responseif token_dict[device_sn] != token:result = {'success': False,'msg': "Authorization failed!"}response = make_response(json.dumps(result), 403)response.headers["Content-Type"] = "application/json"return responsereturn func(*args, **kwargs)return wrapper@app.route('/') def index():return "Hello World!"@app.route('/api/get-token', methods=['POST']) def get_token():user_agent = request.headers.get('User-Agent', "")device_sn = request.headers.get('device_sn', "")os_platform = request.headers.get('os_platform', "")app_version = request.headers.get('app_version', "")data = request.get_json()sign = data.get('sign', "")expected_sign = get_sign(user_agent, device_sn, os_platform, app_version)if expected_sign != sign:result = {'success': False,'msg': "Authorization failed!"}response = make_response(json.dumps(result), 403)else:token = gen_random_string(16)token_dict[device_sn] = tokenresult = {'success': True,'token': token}response = make_response(json.dumps(result))response.headers["Content-Type"] = "application/json"return response@app.route('/api/users') @validate_request def get_users():users_list = [user for uid, user in users_dict.items()]users = {'success': True,'count': len(users_list),'items': users_list}response = make_response(json.dumps(users))response.headers["Content-Type"] = "application/json"return response@app.route('/api/reset-all') @validate_request def clear_users():users_dict.clear()result = {'success': True}response = make_response(json.dumps(result))response.headers["Content-Type"] = "application/json"return response@app.route('/api/users/<int:uid>', methods=['POST']) @validate_request def create_user(uid):user = request.get_json()if uid not in users_dict:result = {'success': True,'msg': "user created successfully."}status_code = 201users_dict[uid] = userelse:result = {'success': False,'msg': "user already existed."}status_code = 500response = make_response(json.dumps(result), status_code)response.headers["Content-Type"] = "application/json"return response@app.route('/api/users/<int:uid>') @validate_request def get_user(uid):user = users_dict.get(uid, {})if user:result = {'success': True,'data': user}status_code = 200else:result = {'success': False,'data': user}status_code = 404response = make_response(json.dumps(result), status_code)response.headers["Content-Type"] = "application/json"return response@app.route('/api/users/<int:uid>', methods=['PUT']) @validate_request def update_user(uid):user = users_dict.get(uid, {})if user:user = request.get_json()success = Truestatus_code = 200users_dict[uid] = userelse:success = Falsestatus_code = 404result = {'success': success,'data': user}response = make_response(json.dumps(result), status_code)response.headers["Content-Type"] = "application/json"return response@app.route('/api/users/<int:uid>', methods=['DELETE']) @validate_request def delete_user(uid):user = users_dict.pop(uid, {})if user:success = Truestatus_code = 200else:success = Falsestatus_code = 404result = {'success': success,'data': user}response = make_response(json.dumps(result), status_code)response.headers["Content-Type"] = "application/json"return response
- 启动测试服务器:
$ export FLASK_APP=tests/api_server.py # 路径填写自己保存的api_server.py绝对路径 $ flask run* Serving Flask app "tests.api_server"* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
- 测试服务器启动起来之后下面就可以开始写Jmeter的http请求了
使用Jmeter编写Http请求
- 先看下接口实例:
url:/api/get-token/method: POSTHeaders:app_version:2.8.6Content-Type:application/jsonos_platform:iosuser_agent:iOS/10.3device_sn:FwgRiO7CNA50DSUbody:{"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"}response:{"success": true,"token": "qba756V9z6rOYOVH"}
- 使用postman请求实例:
headers:
Body(注意:这里选择JSON(application/json)):
- 知道了如何去发接口请求,现在就可以用Jmeter写脚本啦
3.1 新建线程组,所有参数都是默认值即可
3.2 添加配置文件:HTTP信息请求头管理,添加如下参数
Headers:app_version:2.8.6Content-Type:application/jsonos_platform:iosuser_agent:iOS/10.3device_sn:FwgRiO7CNA50DSU
3.3 添加Sampler=>HTTP请求,参数如图所示
3.4 添加监听器=>查看结果树(注意:是在HTTP请求这个Sampler的节点下),运行脚本结果如下,则脚本接口请求成功
下一篇文章中将介绍如何做断言。
Jmeter使用基础系列文章大纲:
Jmeter使用基础笔记-认识Jmeter
Jmeter使用基础笔记-写一个http请求
Jmeter使用基础笔记-API接口返回数据断言
转载于:https://www.cnblogs.com/DeaconOne/p/10787523.html
Jmeter使用基础笔记-写一个http请求相关推荐
- Qt文档阅读笔记-写一个简单的单元测试
程序运行截图如下: 控制台: QtCreator: 源码如下: test.pro QT += widgets testlibHEADERS = head.h SOURCES = source.cpp ...
- jmeter性能使用笔记
jmeter性能使用笔记 一.url请求编码,对应的中文汉字应该使用URL编码进行转换,传参金http/https请求中 二.jmeter按比例执行业务场景 可用函数 __counter实现: 函数助 ...
- 使用Node.js写一个简单的api接口
引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...
- 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!
从零写一个具有IOC-AOP-MVC功能的框架-学习笔记 专栏往期文章链接: IOC功能相关章节: 从零写一个具有IOC-AOP-MVC功能的框架-学习笔记-01.项目初始化 从零写一个具有IOC-A ...
- Jmeter基础系列4-创建一个HTTP请求实例
在前面的章节我们介绍了软件的图形化界面的认识,还有元件的简单介绍,现在我们就可以开启创建第一个Jmeter测试用例吧. 1.新建一个Test Plan,保存之后左侧的测试计划的名称就会变成新的. 2. ...
- 深度学习笔记:手写一个单隐层的神经网络
出处:数据科学家养成记 深度学习笔记2:手写一个单隐层的神经网络 笔记1中我们利用 numpy 搭建了神经网络最简单的结构单元:感知机.笔记2将继续学习如何手动搭建神经网络.我们将学习如何利用 num ...
- animation基础练习源码_用vue简单写一个音乐播放组件「附源码」
作者:vipbic 转发链接:https://segmentfault.com/a/1190000022980992 前言 上次小编也分享一个关于Vue 开发过音乐播放对项目: 基于 electron ...
- golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)
此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...
- python写一个笔记软件_程序员们都用什么记笔记软件?
visual studio + git + github/gitlab visual studio code (简称 vscode)是一款集大成者,上天入地无所不能!比如我想让编辑器支持思维导图,只需 ...
最新文章
- Xcode 小技巧:利用 assets 配置针对不同设备的资源
- html post 发送两次,JS发送跨域Post请求出现两次请求的解决办法
- 书评 | 圈内大佬怎么看编程日历
- Redis应用案例,查找某个值的范围(转)
- linux删除旧网卡,如何删除旧网卡驱动
- 单片机裸机实用组件--LED
- DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例
- 由设置body线性背景色引发的问题-----当声明文档类型时,对body设置线性背景色,页面背景色无法整体线性过渡...
- future java 原理_Java线程池FutureTask实现原理详解
- ELK学习4_Elasticsearch+Logstash+Kibana安装_简易版
- 电子琴节奏包制作_济南这个藏在菜市场的小饺子馆,纯手工制作,老板娘一个人不停忙...
- Dynamics CRM 2013 初体验(1):系统的安装
- 谨慎使用Hibernate中的本机SQL
- mysql数据库日志截断,MySQL基础(十一):查询截取分析
- sftp mysql_Linux下搭建SFTP服务器
- [转]Spring3 MVC + jQuery easyUI 做的ajax版本用户管理
- (CCNET)criss-cross attention network学习笔记
- vue 扁平化_JS数组扁平化(flat)
- audio标签无法自动循环播放问题
- Java Integer值范围问题
热门文章
- Asp.Net大型项目实践(7)-用Unity实现AOP之事务处理+为啥要用AOP(附源码)
- 财务大数据比赛有python吗-Python去做大数据开发,真的有前景吗?
- python3项目-python3搭建Django项目
- 财务需要学python-8年老财务:财务分析学python就能提高效率?一半人是骗子
- python画二维散点图-python3实现绘制二维点图
- python写软件-Python是怎么编写软件的?
- 汇编和python-python语言属于汇编语言吗?_后端开发
- 派森编程软件python-派森Python
- python怎么导入视频-python怎么导入数据
- 20行python代码的入门级小游戏-用Python设计一个经典小游戏