美文网首页
Ubuntu 18 locust 压测 Node 服务

Ubuntu 18 locust 压测 Node 服务

作者: 草帽lufei | 来源:发表于2020-06-16 09:14 被阅读0次

locust 官网: https://www.locust.io/

安装 locust

pip install locust

$ python3 -V
Python 3.6.9
$ pip -V
pip 20.1.1 from /home/w/.local/lib/python3.6/site-packages/pip (python 3.6)
$ pip install locust
...

$ locust -V 
locust 1.0.3

测试脚本

locustfile.py

import random
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(5, 9)

    @task
    def get_users(self):
        print("get_users")
        name = "get_users"
        url = "/api/v1/users_manage"
        params = {}
        headers = {}
        res = self.client.get(url=url, headers=headers, params=params, verify=False, name=name)

    @task
    def get_user_info(self):
        print("get_user_info")
        name = "get_user_info"
        url = "/api/v1/user_info"
        params = {}
        headers = {}
        self.client.get(url=url, headers=headers, params=params, verify=False, name=name)

    def on_start(self):
        # response = self.client.post("/api/v1/login", {"phone": "13912345678", "password": "12345678"})
        print("start")

运行测试脚本

运行 locustfile.py 测试脚本文件

locust

locust -f locustfile.py

没有 webui 界面执行压测

locust -f locustfile.py --headless -u 100 -r 10 --run-time 5m --host http://192.168.199.172:3000 --stop-timeout 99

--headless 直接开始测试而不使用Web界面

-u 要产生的用户数

-r 每秒添加的用户数

--run-time 测试运行时间

--host IP地址

--stop-timeout 测试运行时间完成后,延迟99s再关闭整个任务

服务端

运行 Node 服务,接口返回静态数据

node server.js

server.js

let express = require('express')
let app = express()
let bodyParser = require('body-parser')
let fs = require('fs')
let multer = require('multer')

app.use(express.static('public'))

app.use(bodyParser.urlencoded({
  extended: false
}))

app.use(multer({
  dest: '/tmp/'
}).array('file'))

let cors = require('cors')
app.use(cors())



//  get /
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html')
})

// get users
app.get('/api/v1/users_manage', async (req, res) => {
  let data = [
    {
      user_id: 1,
      username: 'admin',
      password: '12345678',
      nickname: 'admin user'
    },
    {
      user_id: 2,
      username: 'aaa',
      password: '12341234',
      nickname: 'aaa user'
    }
  ]
  console.log('1')
  await new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2s .')
      resolve()
    }, 2000)
  })
  res.end(JSON.stringify(data))
})

// get users
app.get('/api/v1/user_info', async (req, res) => {
  let data = {
    user_id: 1,
    username: 'admin',
    password: '12345678',
    nickname: 'admin user'
  }
  console.log('3')
  await new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('3s .')
      resolve()
    }, 3000)
  })
  res.end(JSON.stringify(data))
})

app.post('/api/v1/login', (req, res) => {
  let data = {
    status: 1
  }
  res.end(JSON.stringify(data))
})

// post 403
app.post('/post_403', (req, res) => {
  res.status(403).send({ error: 'Permission denied' });
})

// post test
app.post('/post_test', (req, res) => {
  console.log('post')
  let data = {
    'post_data': '123'
  }
  console.log('123')
  // res.end(JSON.stringify(data))
  res.end('123')
})

// put file_upload
app.put('/file_upload_put', (req, res) => {
  console.log('file_upload_put')
  let des_file = __dirname + '/public/images/' + req.files[0].originalname
  console.log('des_file: ', des_file)
  fs.readFile(req.files[0].path, (err, data) => {
    fs.writeFile(des_file, data, (err) => {
      if (err) {
        console.log(err)
      } else {
        response = {
          message: 'File Upload Success!',
          filename: req.files[0].originalname
        }
      }
      res.end(JSON.stringify(response))
    })
  })
})


// post file_upload
app.post('/file_upload', (req, res) => {
  console.log('file')
  // console.log(JSON.stringify(req))
  console.log(req.body)
  let file = req.files[0]
  let size = file.size
  // size limit  10MB
  if (size > 10240000) {
    res.end('File beyond size limit !')
    return false
  }

  // let mimetypeFlag = 0
  // let mimetypeArray = ['image/bmp', 'image/gif', 'image/jpeg', 'image/svg+xml', 'image/tiff', 'image/png']
  // let mimetype = file.mimetype
  // for (let i = 0; i < mimetypeArray.length; i++) {
  //   if (mimetype === mimetypeArray[i]) {
  //     mimetypeFlag = 1
  //   }
  // }
  // if (mimetypeFlag === 0) {
  //   res.end('Documents must be image format !')
  //   return false
  // }

  let des_file = __dirname + '/public/images/' + req.files[0].originalname
  fs.readFile(req.files[0].path, (err, data) => {
    fs.writeFile(des_file, data, (err) => {
      if (err) {
        console.log(err)
      } else {
        response = {
          message: 'File Upload Success!',
          filename: req.files[0].originalname
        }
      }
      res.end(JSON.stringify(response))
    })
  })

})

let server = require('http').createServer(app)


server.listen(3000, (req, res) => {
  let host = server.address().address
  let port = server.address().port

  console.log('server is running .  http://%s:%s', host, port)
})

package.json

{
  "name": "fileserver",
  "version": "1.0.0",
  "description": "File server project",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "gyw",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "cookie-parser": "^1.4.3",
    "cors": "^2.8.5",
    "express": "^4.16.2",
    "express-session": "^1.15.6",
    "multer": "^1.3.0",
    "request": "^2.83.0",
    "serve-index": "^1.9.1",
    "serve-static": "^1.13.1",
    "socket.io": "^2.0.3"
  }
}

相关文章

网友评论

      本文标题:Ubuntu 18 locust 压测 Node 服务

      本文链接:https://www.haomeiwen.com/subject/zmhlxktx.html