前言

本篇文章主要讲述2个部分:

  1. 搭建一个简单的测试环境
  2. 用Jmeter发送一个简单的http请求

搭建测试环境

  1. 编写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
  1. 启动测试服务器:

    $ 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)
  1. 测试服务器启动起来之后下面就可以开始写Jmeter的http请求了

使用Jmeter编写Http请求

  1. 先看下接口实例:

    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"
    }
  1. 使用postman请求实例:
    headers:

Body(注意:这里选择JSON(application/json)):

  1. 知道了如何去发接口请求,现在就可以用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请求的更多相关文章

  1. Jmeter使用基础笔记-认识Jmeter

    我在工作过程中接触Jmeter不算特别多,对Jmeter的使用也只是限于基础阶段,不过对付基本的一些需求我想足够使用了.有好几个朋友问我关于Jmeter的问题,在此我将我在工作过程中的使用心得和总结的 ...

  2. jmeter接口测试------基础笔记

    1.postman发送json格式的post请求,直接放链接 row里面body放请求参数,得到请求结果 2.jmeter请求json时需要注意在请求前创建http信息头管理器,然后信息头添加一条名称 ...

  3. 07 python学习笔记-写一个清理日志的小程序(七)

    #删掉三天前的日志 #1.获取到所有的日志文件, os.walk #2.获取文件时间 android 2019-09-27 log,并转成时间戳 #3.获取3天前的时间 time.time() - 6 ...

  4. fetch是什么?写一个fetch请求

    fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法. 参考链接:http ...

  5. 用C++基础语句写一个五子棋游戏

    (这是一个颜色会变化的呦) #include <iostream> using namespace std; int b[][]; int n; int m; void qipan() { ...

  6. jmeter 多个sql写在一个jdbc请求中注意事项

    在url里面加上?allowMultiQueries=true 类型选callableStatement

  7. 接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)

    博主自从毕业从事软件测试行业距今一年半时间,大多数时间都在跟各种API打交道,使用过的接口测试工具也有许多,本文记录下各工具的使用心得,以及重点介绍我在工作中是如何使用Jmeter做测试的,都是在wi ...

  8. 接口测试工具 Jmeter使用笔记(一:编写一个http请求)

    记录学习过程 一.安装Jmeter 1.JAVA环境 JDK下载地址http://java.sun.com/javase/downloads/index.jsp 配置系统变量: (1)JAVA_HOM ...

  9. Jmeter的基础使用一安装、启动、关联、断言

    一.下载Jmeter,配置环境变量 下载完解压即可, 环境变量配置: -------在环境变量中添加新变量JMETER_HOME:D:\jmeter\apache-jmeter-4.0 ------- ...

随机推荐

  1. jquery plupload上传插件

    http://www.jianshu.com/p/047349275cd4 http://www.cnblogs.com/2050/p/3913184.html demo地址: http://chap ...

  2. sql server使用维护计划定时备份完整数据库、差异数据库

    我配置的是: 一个月执行一次完整备份数据库,删除三个月前备份文件.每天执行一次差异备份,删除一个月钱备份文件. 1.管理-维护计划   右键-新建维护计划 2.创建子计划 3.分别配置作业计划属性(执 ...

  3. v-contextmenu的使用(右键菜单)

    先来个自己改写的图: 代码: 结构:<div class="wrap" v-contextmenu:contextmenu> <v-contextmenu ref ...

  4. bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞【spfa判负环】

    tag是假的,用了及其诡异的方法判负环 正权无向边和负权有向边的图 #include<iostream> #include<cstdio> #include<cstrin ...

  5. 慕课网6-4 编程练习:jQuery选择器中的过滤器

    6-4 编程练习 结合所学的jQuery过滤器知识,实现如下图所示的隔行换色效果 任务 使用jQuery的.css()方法设置样式,语法css('属性 '属性值') 使用:odd和:even过滤器实现 ...

  6. Chrome教程之NetWork面板分析网络请求

    官方文档:https://developers.google.com/web/tools/chrome-devtools/network/ 最近打算写一写Chrome教程文档,不知道大家最感兴趣的是什 ...

  7. JAVA POI的使用

    最近开发遇到了要通过Java处理Excel文件的场景,于是乎在网上了解了一番,最后自己做了个demo,已上传gitee:https://gitee.com/github-26930945/JavaCo ...

  8. 378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [   [ 1,  5,  9],   [ ...

  9. SQL函数类的操作,增加,查询

    数据库连接: 表的创建: 创建连接对象,命令对象类: 添加函数: 查询函数类: List<>集合,里面专门放对象 函数主体: 查询: foreach只能修改,不能添加删除

  10. WCF学习笔记(2)-WCF的通讯过程

    一.WCF中的ABC 场景:公司让你送一份合同文件,送文件的过程你可以选择的交通方式有打的,地铁或公交. 到了对方公司后,你要找到某负责人,并且要一份收到合同文件的回执和相应文件 要完成这项工作任务主 ...