golang分层测试之http压测脚本编写(2)

2020-04-28  本文已影响0人  周学习的名字被占了

前言

sync.WaitGroup模块

import (
    "fmt"
    "sync"
)


func main() {
    wg := sync.WaitGroup{}
    wg.Add(20)
    for i := 0; i < 20; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

可以执行查看一些输出

go run synctest.go
1
5
2
3
4
7
6
19
15
0
10
14
18
16
12
8
11
13
17
9

sync.WaitGroup模块编写场景化的压测脚本

#! /usr/bin/env 
#coding=utf-8
import socket
import json
import requests

from flask import Flask, request,jsonify,g

app = Flask(__name__)

filename='demo.txt'

@app.route('/apisetdata', methods=['POST'])
def setdata():
        msg=request.json["msg"]
        print(msg)
        with open(filename, 'w') as f:
            f.write(str(msg))
            f.close()

        resp=jsonify({"code":200,"state":"set msg ok","msg":msg})
        resp.status_code=200
        return resp


@app.route('/apigetdata', methods=['GET'])
def getdata():
        f = open(filename, 'r')
        msg=f.read()
        resp=jsonify({"code":200,"state":"get msg ok","msg":msg})
        resp.status_code=200
        return resp


if __name__ == "__main__":
    app.run(debug=True)


package main

import (
    "fmt"
    "net/http"
    "sync"
    "time"
    "bytes"
    "encoding/json"
    "io/ioutil"
    simplejson "github.com/bitly/go-simplejson"
)


var (
    success = 0
    failure = 0
    useTime = 0.0 //记录请求成功失败数和使用时间
)

var (
    num =100 //要发送的请求数
    con =100 //并发数
)

type HttpData struct {

    Msg string `json:"msg"`

}

var wg sync.WaitGroup //创建一个计数器



func dotest(num int) { //场景化请求方法,在里面可以自定义需要编辑的内容

    defer wg.Done() //进入到方法后计算器-1,标记创建了一个goroutine

    no := 0
    ok := 0
    url := "http://127.0.0.1:5000/apisetdata"
    url2:= "http://127.0.0.1:5000/apigetdata"
    contentType := "application/json;charset=utf-8"

    var httpdata HttpData
    httpdata.Msg = "terrychow"

    
    b ,err := json.Marshal(httpdata)
    if err != nil {
        fmt.Println("json format error:", err)
        return
    }

    body := bytes.NewBuffer(b)

    for i := 0; i < num; i++ {

        //修改内容部分
        resp, err := http.Post(url, contentType, body) //通过apisetdata接口修改内容

        if err != nil {
            no += 1
            fmt.Println("error failed:", err)
            continue 
        }

        defer resp.Body.Close()

        //读取内容部分
        resp2, err := http.Get(url2) //通过apigetdata接口获取内容
        if err != nil {
            no += 1
            fmt.Println("error failed:", err)
            continue 
        }

        defer resp2.Body.Close()
        body, err := ioutil.ReadAll(resp2.Body)
        res, err := simplejson.NewJson([]byte(string(body)))

        getmsg, err := res.Get("msg").String()


        if resp.StatusCode != 200 {
            no += 1
            continue
        }

        if getmsg!=httpdata.Msg{ //断言修改的内容
            no += 1
            continue        
        }

        ok += 1
        continue
    }

    success += ok
    failure += no

}       

// 主函数
func main() {
    startTime := time.Now().UnixNano()

    // 并发开始
    for i := 0; i < con; i++ {
        wg.Add(1)
        go dotest(num/con)
    }
    // fmt.Println("主程序开始wait")
    wg.Wait()
    endTime := time.Now().UnixNano()
    useTime = float64(endTime-startTime) / 1e9
    // 输出结果
    fmt.Println()
    fmt.Println("Complete requests:", success)
    fmt.Println("Failed requests:", failure)
    // fmt.Println("SuccessRate:", fmt.Sprintf("%.2f", ((success/total)*100.0)), "%")
    fmt.Println("UseTime:", fmt.Sprintf("%.4f", useTime), "s")
    fmt.Println("场景每秒处理数 sps:", fmt.Sprintf("%.4f", float64(num)/useTime))
    fmt.Println("请求每秒处理数 qps:", fmt.Sprintf("%.4f", float64(num*2)/useTime))

}
go run pertestgo.go
Complete requests: 100
Failed requests: 0
UseTime: 0.1738 s
场景每秒处理数 sps: 575.4601
请求每秒处理数 qps: 1150.9202

小结

上一篇 下一篇

猜你喜欢

热点阅读