refactor: distributed load testing

This commit is contained in:
徐聪
2022-07-25 21:24:08 +08:00
parent 30ba539cdc
commit 60a6aebbcb
40 changed files with 1958 additions and 1280 deletions
+45 -15
View File
@@ -6,6 +6,7 @@ import (
"testing"
"time"
"github.com/httprunner/httprunner/v4/hrp/internal/boomer/grpc/messager"
"github.com/stretchr/testify/assert"
)
@@ -113,6 +114,32 @@ func TestLoopCount(t *testing.T) {
}
}
func TestStopNotify(t *testing.T) {
r := &localRunner{
runner: runner{
stopChan: make(chan bool),
doneChan: make(chan bool),
},
}
go func() {
<-r.stopChan
close(r.doneChan)
}()
notifier := r.DoneNotify()
select {
case <-notifier:
t.Fatalf("received unexpected stop notification")
default:
}
r.Stop()
select {
case <-notifier:
default:
t.Fatalf("cannot receive stop notification")
}
}
func TestSpawnWorkers(t *testing.T) {
taskA := &Task{
Weight: 10,
@@ -239,7 +266,8 @@ func TestSpawnAndStop(t *testing.T) {
if msg.Type != "spawning_complete" {
t.Error("Runner should send spawning_complete message when spawning completed, got", msg.Type)
}
runner.stop()
go runner.stop()
close(runner.doneChan)
runner.onQuiting()
msg = <-runner.client.sendChannel()
@@ -260,10 +288,11 @@ func TestStop(t *testing.T) {
runner.reset()
runner.updateState(StateSpawning)
runner.stop()
go runner.stop()
close(runner.doneChan)
time.Sleep(1 * time.Second)
if runner.getState() != StateStopped {
t.Error("Expected runner state to be 5, was", runner.getState())
t.Error("Expected runner state to be 5, was", getStateName(runner.getState()))
}
}
@@ -305,7 +334,8 @@ func TestOnQuitMessage(t *testing.T) {
runner.reset()
runner.closeChan = make(chan bool)
runner.client.shutdownChan = make(chan bool)
runner.onMessage(newGenericMessage("quit", nil, runner.nodeID))
go runner.onMessage(newGenericMessage("quit", nil, runner.nodeID))
close(runner.doneChan)
<-runner.closeChan
if runner.getState() != StateQuitting {
t.Error("Runner's state should be StateQuitting")
@@ -359,7 +389,7 @@ func TestOnMessage(t *testing.T) {
t.Error("Runner should send spawning_complete message when spawn completed, got", msg.Type)
}
if runner.getState() != StateRunning {
t.Error("State of runner is not running after spawn, got", runner.getState())
t.Error("State of runner is not running after spawn, got", getStateName(runner.getState()))
}
// increase goroutines while running
@@ -368,7 +398,7 @@ func TestOnMessage(t *testing.T) {
time.Sleep(2 * time.Second)
if runner.getState() != StateRunning {
t.Error("State of runner is not running after spawn, got", runner.getState())
t.Error("State of runner is not running after spawn, got", getStateName(runner.getState()))
}
if runner.controller.getCurrentClientsNum() != 15 {
t.Error("Number of goroutines mismatches, expected: 15, current count:", runner.controller.getCurrentClientsNum())
@@ -377,7 +407,7 @@ func TestOnMessage(t *testing.T) {
// stop all the workers
runner.onMessage(newGenericMessage("stop", nil, runner.nodeID))
if runner.getState() != StateStopped {
t.Error("State of runner is not stopped, got", runner.getState())
t.Error("State of runner is not stopped, got", getStateName(runner.getState()))
}
msg = <-runner.client.sendChannel()
if msg.Type != "client_stopped" {
@@ -401,7 +431,7 @@ func TestOnMessage(t *testing.T) {
t.Error("Number of goroutines mismatches, expected: 10, current count:", runner.controller.getCurrentClientsNum())
}
if runner.getState() != StateRunning {
t.Error("State of runner is not running after spawn, got", runner.getState())
t.Error("State of runner is not running after spawn, got", getStateName(runner.getState()))
}
msg = <-runner.client.sendChannel()
if msg.Type != "spawning_complete" {
@@ -411,7 +441,7 @@ func TestOnMessage(t *testing.T) {
// stop all the workers
runner.onMessage(newGenericMessage("stop", nil, runner.nodeID))
if runner.getState() != StateStopped {
t.Error("State of runner is not stopped, got", runner.getState())
t.Error("State of runner is not stopped, got", getStateName(runner.getState()))
}
msg = <-runner.client.sendChannel()
if msg.Type != "client_stopped" {
@@ -430,8 +460,8 @@ func TestClientListener(t *testing.T) {
runner.setSpawnCount(10)
runner.setSpawnRate(10)
go runner.clientListener()
runner.server.clients.Store("testID1", &WorkerNode{ID: "testID1", Heartbeat: 3})
runner.server.clients.Store("testID2", &WorkerNode{ID: "testID2", Heartbeat: 3})
runner.server.clients.Store("testID1", &WorkerNode{ID: "testID1", Heartbeat: 3, stream: make(chan *messager.StreamResponse, 10)})
runner.server.clients.Store("testID2", &WorkerNode{ID: "testID2", Heartbeat: 3, stream: make(chan *messager.StreamResponse, 10)})
runner.server.recvChannel() <- &genericMessage{
Type: typeClientReady,
NodeID: "testID1",
@@ -470,7 +500,7 @@ func TestClientListener(t *testing.T) {
}
time.Sleep(time.Second)
if runner.getState() != StateStopped {
t.Error("State of master runner is not stopped, got", runner.getState())
t.Error("State of master runner is not stopped, got", getStateName(runner.getState()))
}
}
@@ -480,8 +510,8 @@ func TestHeartbeatWorker(t *testing.T) {
runner.updateState(StateInit)
runner.setSpawnCount(10)
runner.setSpawnRate(10)
runner.server.clients.Store("testID1", &WorkerNode{ID: "testID1", Heartbeat: 1, State: StateInit})
runner.server.clients.Store("testID2", &WorkerNode{ID: "testID2", Heartbeat: 1, State: StateInit})
runner.server.clients.Store("testID1", &WorkerNode{ID: "testID1", Heartbeat: 1, State: StateInit, stream: make(chan *messager.StreamResponse, 10)})
runner.server.clients.Store("testID2", &WorkerNode{ID: "testID2", Heartbeat: 1, State: StateInit, stream: make(chan *messager.StreamResponse, 10)})
go runner.clientListener()
go runner.heartbeatWorker()
time.Sleep(3 * time.Second)