Skip to content
This repository has been archived by the owner on Jan 1, 2024. It is now read-only.
/ artillery-demo Public archive

Demonstração de uma ferramenta de teste de carga em um app Express.

Notifications You must be signed in to change notification settings

mdccg/artillery-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

artillery-demo

Sumário

Motivação

Este repositório de código consiste em uma demonstração da ferramenta de teste de carga Artillery. O professor decidiu utilizar um antigo repositório de código da unidade curricular Linguagem de Programação III para demonstrar o funcionamento dela. Para isso, ele adicionou um novo arquivo chamado populate.ts, que é responsável por popular o banco de dados com 100.000 contatos. Em seguida, foi programado o Artillery com o arquivo find_contacts.yaml.

Esse arquivo tem como objetivo "bombardear" a API com requisições para avaliar sua otimização. No retalho de código-fonte abaixo, são configuradas as informações básicas do teste. A propriedade target indica a URL alvo do teste, neste caso, http://localhost:3001, que é o endereço local da aplicação em teste. Em seguida, temos a propriedade phases, que especifica as fases do teste de carga. Neste exemplo, há apenas uma fase com duração de 10 segundos e uma taxa de chegada (arrival rate) de uma solicitação por segundo.

config:
  target: 'http://localhost:3001'
  phases:
    - duration: 10
      arrivalRate: 1

Já no retalho de código-fonte abaixo, são definidos os cenários de teste. Aqui, tem-se um único cenário chamado Find all contacts. O cenário consiste em uma sequência de etapas representadas pelo campo flow. Neste caso, temos apenas uma etapa que envolve uma requisição HTTP GET para a rota /contacts. A seção expect lista as expectativas do teste. Aqui, espera-se que a resposta da requisição tenha um código de status 200, indicando que a solicitação foi bem-sucedida.

scenarios:
  - name: 'Find all contacts'
    flow:
      - get:
          url: '/contacts'
    expect:
      - statusCode: 200

Este foi o primeiro repositório de código apresentado no Curso Superior de TSI do IFMS como requisito para obtenção da nota parcial das atividades da unidade curricular Web Services. É digno de nota que nesta unidade curricular, teremos a oportunidade de aprender sobre a otimização de APIs e reforçar boas convenções de desenvolvimento.

Próximo repositório →

Pilha de tecnologia

Papel Tecnologia
Linguagem de programação TypeScript
Framework back-end Express.js
Banco de dados MongoDB
Mapeamento Objeto-Documento Mongoose
Virtualização do banco de dados Docker
Ferramenta de teste de carga Artillery
Armazenamento de estrutura de dados em memória Redis

Exemplos de saída em um shell de comando

$ artillery run ./load_tests/find_contacts.yaml 
Test run id: txpxr_qqyk4458kdmcj394cegyzpr7ydmyg_4ecc
Phase started: unnamed (index: 0, duration: 10s) 19:01:13(-0400)

Phase completed: unnamed (index: 0, duration: 10s) 19:01:23(-0400)

--------------------------------------
Metrics for period to: 19:01:20(-0400) (width: 4.998s)
--------------------------------------

http.request_rate: ............................................................. 1/sec
http.requests: ................................................................. 6
vusers.created: ................................................................ 6
vusers.created_by_name.Find all contacts: ...................................... 6


Warning: multiple batches of metrics for period 1690844470000 2023-07-31T23:01:10.000Z
--------------------------------------
Metrics for period to: 19:01:30(-0400) (width: 9.005s)
--------------------------------------

errors.ETIMEDOUT: .............................................................. 5
http.codes.200: ................................................................ 1
http.downloaded_bytes: ......................................................... 16594367
http.request_rate: ............................................................. 1/sec
http.requests: ................................................................. 4
http.response_time:
  min: ......................................................................... 6454
  max: ......................................................................... 6454
  median: ...................................................................... 6439.7
  p95: ......................................................................... 6439.7
  p99: ......................................................................... 6439.7
http.responses: ................................................................ 1
vusers.completed: .............................................................. 1
vusers.created: ................................................................ 4
vusers.created_by_name.Find all contacts: ...................................... 4
vusers.failed: ................................................................. 5
vusers.session_length:
  min: ......................................................................... 6636.3
  max: ......................................................................... 6636.3
  median: ...................................................................... 6702.6
  p95: ......................................................................... 6702.6
  p99: ......................................................................... 6702.6


--------------------------------------
Metrics for period to: 19:01:40(-0400) (width: 3.011s)
--------------------------------------

errors.ETIMEDOUT: .............................................................. 4
vusers.failed: ................................................................. 4


All VUs finished. Total time: 20 seconds

--------------------------------
Summary report @ 19:01:35(-0400)
--------------------------------

errors.ETIMEDOUT: .............................................................. 9
http.codes.200: ................................................................ 1
http.downloaded_bytes: ......................................................... 16594367
http.request_rate: ............................................................. 1/sec
http.requests: ................................................................. 10
http.response_time:
  min: ......................................................................... 6454
  max: ......................................................................... 6454
  median: ...................................................................... 6439.7
  p95: ......................................................................... 6439.7
  p99: ......................................................................... 6439.7
http.responses: ................................................................ 1
vusers.completed: .............................................................. 1
vusers.created: ................................................................ 10
vusers.created_by_name.Find all contacts: ...................................... 10
vusers.failed: ................................................................. 9
vusers.session_length:
  min: ......................................................................... 6636.3
  max: ......................................................................... 6636.3
  median: ...................................................................... 6702.6
  p95: ......................................................................... 6702.6
  p99: ......................................................................... 6702.6
$ ts-node src/server.ts
Opening connection to database...
App running on port 3001
App connected to db contactbook_dev
GET /contacts 200 6444.762 ms - 16594367
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -
GET /contacts - - ms - -

Como rodar

Pré-requisitos

Passo a passo

  1. Clone o repositório de código em sua máquina;

  2. Abra um shell de comando de sua preferência (prompt de comando, PowerShell, terminal etc.);

  3. Instale as dependências do projeto através do seguinte comando:

$ npm install

Caso esteja utilizando o gerenciador de pacotes Yarn, execute o seguinte comando como alternativa:

$ yarn
  1. Com o Docker instalado, execute o comando abaixo para levantar o container Docker com o respectivo banco de dados virtualizado. Certifique-se de estar no diretório do arquivo docker-compose.yml;
$ docker-compose up -d

O parâmetro -d serve para desocupar o shell de comando logo após a execução do comando. É uma boa convenção, ao encerrar a execução do app, derrubar o container levantado através do comando:

$ docker-compose down

Mas, não se preocupe. As tuplas inseridas no banco de dados não serão deletadas com a derrubada do container.

  1. Execute o seguinte comando para executar o app:

Para npm:

$ npm run start

Para Yarn:

$ yarn start
  1. Execute o script populate para popular o banco de dados. Urgente: é altamente recomendado que você tenha preparado, no mínimo, um litro de café para esta etapa; visto que ela pode levar um bocado de tempo e isso depende diretamente da capacidade da sua máquina.

  2. Instale o Artillery em sua máquina através do seguinte comando:

$ npm i -g artillery@latest
  1. Com o container levantado e o app em execução, "bombardeie" a API com requisições através do seguinte comando:
$ artillery run ./load_tests/find_contacts.yaml

Certifique-se de estar na raiz do projeto para executar o comando acima.

About

Demonstração de uma ferramenta de teste de carga em um app Express.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published