Skip to content

Commit

Permalink
Merge pull request #12 from brenoma/feature/stress-test
Browse files Browse the repository at this point in the history
Stress testing
  • Loading branch information
brenoma authored Nov 10, 2021
2 parents 7b4cd25 + 56cfc32 commit b435e25
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 3 deletions.
12 changes: 12 additions & 0 deletions src/app.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}

@Get()
getHello(): string {
return this.appService.getHello();
}
}
9 changes: 6 additions & 3 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

import { AppController } from './app.controller';
import { AppService } from './app.service';

import { UserController } from './controllers/user/user.controller';
import { User } from './models/user.model';
import { UserService } from './controllers/user/user.service';
import { UserModule } from './controllers/user/user.module';

import { AuthModule } from './controllers/auth/auth.module';
import { AuthController } from './controllers/auth/auth.controller';
Expand All @@ -14,6 +16,7 @@ import { MessageController } from './controllers/message/message.controller';
import { MessageModule } from './controllers/message/message.module';
import { MessageService } from './controllers/message/message.service';
import { Message } from './models/message.model';

import { WebsocketService } from './websocket/websocket.service';

@Module({
Expand All @@ -32,7 +35,7 @@ import { WebsocketService } from './websocket/websocket.service';
AuthModule,
MessageModule,
],
controllers: [UserController, AuthController, MessageController],
providers: [UserService, MessageService, WebsocketService],
controllers: [AppController, UserController, AuthController, MessageController],
providers: [AppService, UserService, MessageService, WebsocketService],
})
export class AppModule { }
8 changes: 8 additions & 0 deletions src/app.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
65 changes: 65 additions & 0 deletions stress-test/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { check } from 'k6';
import http from 'k6/http';
import { Rate } from 'k6/metrics';
import faker from 'https://unpkg.com/[email protected]/dist/faker.js';

const loginFailedRate = new Rate('failed login request');
const registerFailedRate = new Rate('failed register request');
const emailDomain = Math.random().toString(36).substring(2, 15) + '.lol';

export function requestLogin(baseUrl) {
const payload = JSON.stringify({
username: '[email protected]',
password: '123',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
const res = http.post(`${baseUrl}/users/login`, payload, params);

const result = check(res, {
'Login successfully': res => res.status === 201,
'JSON response': res => /json/.test(res.headers['Content-Type']),
});
loginFailedRate.add(!result);
}

export function requestRegister(baseUrl) {
const payload = JSON.stringify({
name: faker.name.findName(),
email: `stress_${__VU}+${__ITER}@${emailDomain}`,
password: faker.internet.password(),
role: 'admin'
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
const res = http.post(`${baseUrl}/users/create`, payload, params);

const result = check(res, {
'Register successfully': res => res.status === 201,
'Authorization header': /Bearer\s+.*/.test(res.headers.Authorization),
'JSON response': res => /json/.test(res.headers['Content-Type']),
});
registerFailedRate.add(!result);
}

export function requestFind(baseUrl) {
const payload = JSON.stringify({
email: '[email protected]',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
const res = http.post(`${baseUrl}/users/find`, payload, params);

check(res, {
'Get user session': res => res.status === 201,
});
}
41 changes: 41 additions & 0 deletions stress-test/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import http from 'k6/http';
import { sleep, check, group } from 'k6';

import { requestLogin, requestRegister, requestFind } from './auth.js';

const baseUrl = 'http://localhost:3000';

export const options = {
vus: 30,
duration: '30s',
discardResponseBodies: true,
thresholds: {
checks: ['rate>0.9'],
'failed login request': ['rate < 0.1'],
'failed register request': ['rate < 0.1'],
},
};

// export function setup() {
// const res = http.post(`${baseUrl}/users/login`, {
// username: '[email protected]',
// password: '123',
// });
// const [, token] = res.body.token

// return { token };
// }

export default function (data) {
const res = http.get(baseUrl);

check(res, {
'status is OK': res => res.status === 200,
});
group('Authorization', () => {
requestLogin(baseUrl);
// requestRegister(baseUrl);
requestFind(baseUrl);
});
sleep(1);
}

0 comments on commit b435e25

Please sign in to comment.