前言

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

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

搭建测试环境

  1. 编写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

  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: POSTHeaders:app_version:2.8.6Content-Type:application/jsonos_platform:iosuser_agent:iOS/10.3device_sn:FwgRiO7CNA50DSUbody:{"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.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请求相关推荐

  1. Qt文档阅读笔记-写一个简单的单元测试

    程序运行截图如下: 控制台: QtCreator: 源码如下: test.pro QT += widgets testlibHEADERS = head.h SOURCES = source.cpp ...

  2. jmeter性能使用笔记

    jmeter性能使用笔记 一.url请求编码,对应的中文汉字应该使用URL编码进行转换,传参金http/https请求中 二.jmeter按比例执行业务场景 可用函数 __counter实现: 函数助 ...

  3. 使用Node.js写一个简单的api接口

    引入Http模块 默认你已经安装了Node.js Node当中内置了Http模块: 可以使用 var http= require("http"); 复制代码 引入http模块: H ...

  4. 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!

    从零写一个具有IOC-AOP-MVC功能的框架-学习笔记 专栏往期文章链接: IOC功能相关章节: 从零写一个具有IOC-AOP-MVC功能的框架-学习笔记-01.项目初始化 从零写一个具有IOC-A ...

  5. Jmeter基础系列4-创建一个HTTP请求实例

    在前面的章节我们介绍了软件的图形化界面的认识,还有元件的简单介绍,现在我们就可以开启创建第一个Jmeter测试用例吧. 1.新建一个Test Plan,保存之后左侧的测试计划的名称就会变成新的. 2. ...

  6. 深度学习笔记:手写一个单隐层的神经网络

    出处:数据科学家养成记 深度学习笔记2:手写一个单隐层的神经网络 笔记1中我们利用 numpy 搭建了神经网络最简单的结构单元:感知机.笔记2将继续学习如何手动搭建神经网络.我们将学习如何利用 num ...

  7. animation基础练习源码_用vue简单写一个音乐播放组件「附源码」

    作者:vipbic 转发链接:https://segmentfault.com/a/1190000022980992 前言 上次小编也分享一个关于Vue 开发过音乐播放对项目: 基于 electron ...

  8. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

  9. python写一个笔记软件_程序员们都用什么记笔记软件?

    visual studio + git + github/gitlab visual studio code (简称 vscode)是一款集大成者,上天入地无所不能!比如我想让编辑器支持思维导图,只需 ...

最新文章

  1. Xcode 小技巧:利用 assets 配置针对不同设备的资源
  2. html post 发送两次,JS发送跨域Post请求出现两次请求的解决办法
  3. 书评 | 圈内大佬怎么看编程日历
  4. Redis应用案例,查找某个值的范围(转)
  5. linux删除旧网卡,如何删除旧网卡驱动
  6. 单片机裸机实用组件--LED
  7. DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例
  8. 由设置body线性背景色引发的问题-----当声明文档类型时,对body设置线性背景色,页面背景色无法整体线性过渡...
  9. future java 原理_Java线程池FutureTask实现原理详解
  10. ELK学习4_Elasticsearch+Logstash+Kibana安装_简易版
  11. 电子琴节奏包制作_济南这个藏在菜市场的小饺子馆,纯手工制作,老板娘一个人不停忙...
  12. Dynamics CRM 2013 初体验(1):系统的安装
  13. 谨慎使用Hibernate中的本机SQL
  14. mysql数据库日志截断,MySQL基础(十一):查询截取分析
  15. sftp mysql_Linux下搭建SFTP服务器
  16. [转]Spring3 MVC + jQuery easyUI 做的ajax版本用户管理
  17. (CCNET)criss-cross attention network学习笔记
  18. vue 扁平化_JS数组扁平化(flat)
  19. audio标签无法自动循环播放问题
  20. Java Integer值范围问题

热门文章

  1. Asp.Net大型项目实践(7)-用Unity实现AOP之事务处理+为啥要用AOP(附源码)
  2. 财务大数据比赛有python吗-Python去做大数据开发,真的有前景吗?
  3. python3项目-python3搭建Django项目
  4. 财务需要学python-8年老财务:财务分析学python就能提高效率?一半人是骗子
  5. python画二维散点图-python3实现绘制二维点图
  6. python写软件-Python是怎么编写软件的?
  7. 汇编和python-python语言属于汇编语言吗?_后端开发
  8. 派森编程软件python-派森Python
  9. python怎么导入视频-python怎么导入数据
  10. 20行python代码的入门级小游戏-用Python设计一个经典小游戏