Jmeter使用基础笔记-写一个http请求
前言
本篇文章主要讲述2个部分:
- 搭建一个简单的测试环境
- 用Jmeter发送一个简单的http请求
搭建测试环境
- 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保存为api_server.py:import hashlib 
 import hmac
 import json
 from functools import wraps from flask import Flask, make_response, request
 from httprunner.built_in import gen_random_string try:
 from httpbin import app as httpbin_app
 HTTPBIN_HOST = "127.0.0.1"
 HTTPBIN_PORT = 3458
 HTTPBIN_SERVER = "http://{}:{}".format(HTTPBIN_HOST, HTTPBIN_PORT)
 except ImportError:
 httpbin_app = None
 HTTPBIN_HOST = "httpbin.org"
 HTTPBIN_PORT = 443
 HTTPBIN_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 sign def 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 response if 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 response return 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] = token result = {
 '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 = 201
 users_dict[uid] = user
 else:
 result = {
 'success': False,
 'msg': "user already existed."
 }
 status_code = 500 response = 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 = 200
 else:
 result = {
 'success': False,
 'data': user
 }
 status_code = 404 response = 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 = True
 status_code = 200
 users_dict[uid] = user
 else:
 success = False
 status_code = 404 result = {
 '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 = True
 status_code = 200
 else:
 success = False
 status_code = 404 result = {
 '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:
 POST Headers:
 app_version:2.8.6
 Content-Type:application/json
 os_platform:ios
 user_agent:iOS/10.3
 device_sn:FwgRiO7CNA50DSU body:
 {"sign": "958a05393efef0ac7c0fb80a7eac45e24fd40c27"} response:
 {
 "success": true,
 "token": "qba756V9z6rOYOVH"
 }
- 使用postman请求实例:
 headers:
  
Body(注意:这里选择JSON(application/json)):

- 知道了如何去发接口请求,现在就可以用Jmeter写脚本啦
 3.1 新建线程组,所有参数都是默认值即可
 3.2 添加配置文件:HTTP信息请求头管理,添加如下参数
Headers:
app_version:2.8.6
Content-Type:application/json
os_platform:ios
user_agent:iOS/10.3
device_sn:FwgRiO7CNA50DSU

3.3 添加Sampler=>HTTP请求,参数如图所示

3.4 添加监听器=>查看结果树(注意:是在HTTP请求这个Sampler的节点下),运行脚本结果如下,则脚本接口请求成功

下一篇文章中将介绍如何做断言。
Jmeter使用基础系列文章大纲:
Jmeter使用基础笔记-认识Jmeter
Jmeter使用基础笔记-写一个http请求
Jmeter使用基础笔记-API接口返回数据断言
Jmeter使用基础笔记-写一个http请求的更多相关文章
- Jmeter使用基础笔记-认识Jmeter
		我在工作过程中接触Jmeter不算特别多,对Jmeter的使用也只是限于基础阶段,不过对付基本的一些需求我想足够使用了.有好几个朋友问我关于Jmeter的问题,在此我将我在工作过程中的使用心得和总结的 ... 
- jmeter接口测试------基础笔记
		1.postman发送json格式的post请求,直接放链接 row里面body放请求参数,得到请求结果 2.jmeter请求json时需要注意在请求前创建http信息头管理器,然后信息头添加一条名称 ... 
- 07 python学习笔记-写一个清理日志的小程序(七)
		#删掉三天前的日志 #1.获取到所有的日志文件, os.walk #2.获取文件时间 android 2019-09-27 log,并转成时间戳 #3.获取3天前的时间 time.time() - 6 ... 
- fetch是什么?写一个fetch请求
		fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法. 参考链接:http ... 
- 用C++基础语句写一个五子棋游戏
		(这是一个颜色会变化的呦) #include <iostream> using namespace std; int b[][]; int n; int m; void qipan() { ... 
- jmeter 多个sql写在一个jdbc请求中注意事项
		在url里面加上?allowMultiQueries=true 类型选callableStatement 
- 接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)
		博主自从毕业从事软件测试行业距今一年半时间,大多数时间都在跟各种API打交道,使用过的接口测试工具也有许多,本文记录下各工具的使用心得,以及重点介绍我在工作中是如何使用Jmeter做测试的,都是在wi ... 
- 接口测试工具    Jmeter使用笔记(一:编写一个http请求)
		记录学习过程 一.安装Jmeter 1.JAVA环境 JDK下载地址http://java.sun.com/javase/downloads/index.jsp 配置系统变量: (1)JAVA_HOM ... 
- Jmeter的基础使用一安装、启动、关联、断言
		一.下载Jmeter,配置环境变量 下载完解压即可, 环境变量配置: -------在环境变量中添加新变量JMETER_HOME:D:\jmeter\apache-jmeter-4.0 ------- ... 
随机推荐
- android 使用AlarmManager定时启动service
			private static AlarmManager am; private static PendingIntent pendingIntent; /** * 使用 AlarmManager 来 ... 
- python-----使用requirements.txt批量安装包
			首先写一个 requirements.txt,格式如图: 然后使用命令行,到 requirements.txt 所在的目录下,执行命令: pip install -r requirements.txt ... 
- [odb-users] query results not being cached?
			Burton, Craig crburton at tnsi.comWed Jun 6 13:58:03 EDT 2012 Previous message: [odb-users] query re ... 
- http-2.4
			http-2.4 1)新特性 (1)MPM 支持运行为DSO 机制:以模块形式按需加载 (2)event MPM 生产环境可用 (3)异步读写机制 (4)支持每模块及每目录的单独日志级别定义 (5)每 ... 
- 经典矩阵dp寻找递增最大长度
			竖向寻找矩阵最大递增元素长度,因为要求至少一列为递增数列,那么每行求一下最大值就可以作为len[i]:到i行截止的最长的递增数列长度. C. Alyona and Spreadsheet time l ... 
- 231 Power of Two 2的幂
			给定一个整数,写一个函数来判断它是否是2的幂. 详见:https://leetcode.com/problems/power-of-two/description/ Java实现: class Sol ... 
- 289 Game of Life 生命的游戏
			假设有一个大小为m*n的板子,有m行,n列个细胞.每个细胞有一个初始的状态,死亡或者存活.每个细胞和它的邻居(垂直,水平以及对角线).互动规则如下:1.当前细胞存活时,周围低于2个存活细胞时,该细胞死 ... 
- 最简单的SPA(单页应用)实现
			$(function(){ var replacePage = function(href, onFinish){ $.get(href,{},function(raw){ var data = ra ... 
- SQL优化器简介
			文章导读: 什么是RBO? 什么是CBO? 我们在工作中经常会听到这样的声音:"SQL查询慢?你给数据库加个索引啊".虽然加索引并不一定能解决问题,但是这初步的体现了SQL优化的思 ... 
- 【C++】Item18. Make interfaces easy to use correctly and hard to use incorrectly
			接口容易被正确使用,不易被误用 c++简单工厂模式时,初级实现为ITest* CreateTestOld(), 然后用户负责释放返回的对象.如果忘记释放就会造成memory leak,所以在设计工厂接 ... 
