Teste de carga como um serviço de IC para desenvolvedores



Um dos problemas que os fornecedores de software de vários produtos costumam encontrar é a duplicação de competências de engenheiros - desenvolvedores, testadores e administradores de infraestrutura - em quase todas as equipes. Isso também se aplica a engenheiros caros - especialistas na área de testes de carga.

Em vez de se envolver em suas responsabilidades diretas e usar sua experiência única para criar o processo de teste de carga, escolhendo uma metodologia, métricas ideais e autoteste de gravação de acordo com perfis de carga, os engenheiros geralmente precisam implantar a infraestrutura de teste do zero, configurar ferramentas de carga e incorporá-las nos sistemas de CI, configure o monitoramento e a publicação de relatórios.

Você pode encontrar soluções para alguns problemas organizacionais nos testes que usamos na Positive Technologies em outro artigo . E aqui falarei sobre a possibilidade de integrar testes de carga em um pipeline de IC comum usando o conceito de "teste de carga como serviço". Você aprenderá como e quais imagens da janela de encaixe das fontes de carregamento podem ser usadas no pipeline do IC; Como conectar fontes de carregamento ao seu projeto de IC usando um modelo de montagem; como é um pipe de demonstração para executar testes de carga e publicar resultados. Este artigo pode ser útil para engenheiros de teste de software e engenheiros de automação da CI, que pensaram na arquitetura de seu sistema de carga.

Essência do conceito


O conceito de teste de carga como serviço implica a capacidade de integrar as ferramentas de carregamento Apache JMeter, Yandex.Tank e estruturas próprias em um sistema arbitrário de integração contínua. Uma demonstração será para o GitLab CI, mas os princípios são declarados comuns a todos os sistemas de CI.

O teste de carga como serviço é um serviço centralizado para a realização de testes de carga. Os testes de carga são executados em conjuntos de agentes dedicados, os resultados são publicados automaticamente no GitLab Pages, Influx DB e Grafana ou em sistemas de relatório de teste (TestRail, ReportPortal, etc.). A automação e o dimensionamento são realizados da maneira mais simples possível - adicionando e parametrizando o modelo gitlab-ci.yml usual no projeto GitLab CI.

A vantagem da abordagem é que toda a infraestrutura de CI, agentes de carga, imagens de encaixe de fontes de carga, pipelines de teste e publicação de relatórios são suportadas pelo departamento central de automação (engenheiros do DevOps) e os engenheiros de teste de carga podem concentrar seus esforços no desenvolvimento de testes e análise de seus resultados, sem lidar com questões de infraestrutura.

Para simplificar a descrição, supomos que o aplicativo ou servidor de teste de destino já esteja implantado e configurado com antecedência (para isso, scripts automatizados em Python, SaltStack, Ansible etc. podem ser usados). Então, todo o conceito de teste de estresse como serviço se encaixa em três estágios: preparação, teste, publicação de relatórios . Mais detalhes no diagrama (todas as imagens são clicáveis):




Ao realizar testes de estresse, tentamos aderir aos padrões e metodologia do ISTQB , usamos a terminologia apropriada e as métricas recomendadas. Vou dar uma pequena lista de conceitos e definições básicas no teste de carga.

O agente de carregamento (agente de carregamento) - a máquina virtual na qual o aplicativo será iniciado - a origem do carregamento (Apache JMeter, Yandex.Tank ou módulo de carregamento auto-gravado).

O objetivo do teste (destino) é um servidor ou aplicativo instalado no servidor que será submetido ao carregamento.

Um caso de teste é um conjunto de etapas parametrizadas: ações do usuário e reações esperadas a essas ações, com solicitações e respostas de rede fixas, dependendo dos parâmetros especificados.

Perfil ou plano de carga (perfil) - na metodologia ISTQB (Seção 4.2.4, p. 43), os perfis de carga determinam as métricas críticas para um teste específico e as opções para alterar os parâmetros de carga durante o teste. Você pode ver exemplos de perfis na figura. Teste é um script com um conjunto predefinido de parâmetros. Plano de teste - suíte de testes e perfil de carga. Testrun (testrun) - uma iteração da execução de um teste com um cenário de carga totalmente executado e um relatório recebido. Solicitação de rede (solicitação) - uma solicitação HTTP enviada do agente para o destino. Resposta da rede (resposta) - uma resposta HTTP enviada do destino para o agente.












O status da resposta HTTP é um código de resposta padrão do servidor de aplicativos.
Transação (transação) - um ciclo completo de "solicitação - resposta". Uma transação é contada desde o início do envio de uma solicitação (solicitação) até a conclusão do recebimento de uma resposta (resposta).

Status da transação (status das transações) - se o ciclo "solicitação - resposta" foi concluído com êxito. Se houver algum erro nesse loop, a transação inteira será considerada malsucedida.

Tempo de resposta (latência) - tempo desde o final do envio de uma solicitação (solicitação) até o início do recebimento de uma resposta (resposta).

Métricas de carregamento (métricas) - as características do serviço carregado e do agente de carregamento definidas durante o processo de teste de carga.

Métricas básicas para medir parâmetros de carga


Algumas das métricas mais comuns e recomendadas na metodologia ISTQB (p. 36, 52) são mostradas na tabela abaixo. Métricas semelhantes para o agente e o destino são mostradas na mesma linha.

Métricas do agente de carregamentoMétricas do sistema ou aplicativo de destino testado sob carga
O número de   vCPU e memória RAM ,
disco - características "de ferro" do agente de carregamento
CPU , memória, uso de disco - a dinâmica de carregamento do processador, memória e disco
durante o teste. Geralmente medido como uma porcentagem dos
valores máximos disponíveis.
Network throughput (on load agent) —
,
.
(bps)
Network throughput(on target) —
. (bps)
Virtual users— ,

Virtual users status, Passed/Failed/Total —

, .

,
, .
,
Requests per second (minute)— ( ).

: .
Responses per second (minute)
— ( ).

:

HTTP responses status
, .
, 200 OK ,
404 —
Latency ( ) —
(request) (response).
(ms)
Transaction response time— ,
« — ».
(request)
(response).

( )
: ,
, , , 90- .

.
,
,
Transactions per second (minute)
(),

.
Transactions status , Passed / Failed / Total —
, .





O esquema básico de teste de carga é muito simples e consiste em três estágios principais, que eu já mencionei: Preparar - Teste - Relatório , ou seja, preparar metas de teste e definir parâmetros para fontes de carga, depois executar testes de carga e, finalmente, gerar e publicar um relatório sobre o teste. Notas para o regime:





  • QA.Tester - especialista em testes de estresse,
  • Target é o aplicativo de destino para o qual você precisa conhecer seu comportamento sob carga.

Classificador de entidades, estágios e etapas no diagrama


Etapas e etapasO que está acontecendoO que há na entradaQual é a saída
Preparar: fase de preparação do teste
Parâmetros de cargaDefinindo e inicializando parâmetros de carregamento do
usuário
,
selecionando métricas e
preparando um plano de teste
(perfil de carregamento)


-
VM




Env




:
, ,

LoadAgents,
.
-
-
(, JM )



Test: . , GitLab CI
Load
-



-



RunAgents




-
Logs«»
:
,

,


Metrics«»
Report:
Generator

«»


,





«»
,

,
Publish


«»
,



,

CI-


Vamos para a parte prática. Quero mostrar como, em alguns projetos da Positive Technologies , implementamos o conceito de teste de estresse como serviço.

Primeiro, com a ajuda de nossos engenheiros de DevOps, criamos um pool de agentes dedicado no GitLab CI para executar testes de carga. Para não confundi-los em modelos com outros, como conjuntos de montagens, adicionamos tags a esses agentes, tags : load. Você pode usar outras tags claras. Eles são definidos durante o registro dos GitLab CI Runners.

Como descobrir a energia necessária por hardware? As características dos agentes de carregamento - uma quantidade suficiente de vCPU, RAM e disco - podem ser calculadas com base em que Docker, Python (para Yandex.Tank), agente de GitLab CI, Java (para Apache JMeter) devem estar em execução no agente. Para Java no JMeter, também é recomendável usar no mínimo 512 MB de RAM e, como limite superior, 80% da memória disponível .

Portanto, com base em nossa experiência, recomendamos o uso de pelo menos 4 vCPU, 4 GB de RAM, 60 GB SSD para agentes de carregamento. A largura de banda da placa de rede é determinada com base nos requisitos do perfil de carga.

Usamos principalmente duas fontes de carregamento - imagens do docker Apache JMeter e Yandex.Tank.

Yandex.Tank- Esta é a ferramenta de código aberto do Yandex para testes de estresse. Sua arquitetura modular é baseada no gerador de solicitações HTTP assíncronas de alto desempenho Phantom. O tanque possui monitoramento interno dos recursos do servidor testado usando o protocolo SSH, pode interromper o teste automaticamente de acordo com as condições especificadas, pode exibir os resultados no console e na forma de gráficos, você pode conectar seus módulos a ele para expandir a funcionalidade. A propósito, usamos o Tank quando ele ainda não era popular. No artigo “ Yandex.Tank e automação de testes de carga ”, você pode ler a história de como, em 2013, a usamos para realizar testes de carga do PT Appllication Firewall - um dos produtos de nossa empresa.

Apache JMeterÉ uma ferramenta de código aberto para realizar testes de estresse do Apache. Ele pode ser usado igualmente bem para testar aplicativos da Web estáticos e dinâmicos. O JMeter suporta um grande número de protocolos e maneiras de interagir com aplicativos: HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET etc.), serviços da Web SOAP / REST, FTP, TCP, LDAP, SMTP (S), POP3 (S ) e IMAP (S), bancos de dados por meio do JDBC, podem executar comandos do shell e trabalhar com objetos Java. O JMeter possui um IDE para criar, depurar e executar planos de teste. Há também uma CLI para trabalhar na linha de comando de qualquer Java OS compatível (Linux, Windows, Mac OS X). A ferramenta pode gerar dinamicamente um relatório de teste HTML.

Para facilitar o uso em nossa empresa, para a capacidade dos testadores de alterar e adicionar o ambiente, criamos imagens de docker de fontes de carga no GitLab CI com publicação no docker-register interno no Artifactory . Dessa forma, fica mais rápido e fácil conectá-los em tubulações para testes de carga. Como fazer o docker enviar o registro via GitLab CI - consulte as instruções .

O arquivo docker básico para o Yandex.Tank foi o que fizemos:

Dockerfile 
1 | FROM direvius/yandex-tank
2 | ENTRYPOINT [""]

E para o Apache JMeter, este:

Dockerfile 
1 | FROM vmarrazzo/jmeter
2 | ENTRYPOINT [""]

Você pode ler como nosso sistema de integração contínua funciona no artigo “ Automação de processos de desenvolvimento: como implementamos as idéias de DevOps em tecnologias positivas ”.

Modelo e pipeline


Um modelo de exemplo para a realização de testes de carga está disponível no projeto demo-load . Você pode ler as instruções para usar o modelo no arquivo leia - me . No próprio modelo (o arquivo .gitlab-ci.yml ), há observações sobre o que é responsável por esta ou aquela etapa.

O modelo é muito simples e demonstra os três estágios do teste de carga descritos acima no diagrama: preparação, teste e publicação de relatórios. Responsável pelo diretório de estágios : o Preparar, o Teste e o Relatório .

  1. Prepare . , - docker registry: Test. .
  2. Test , . : Yandex.Tank, Apache JMeter, . job-. :

    : CI- . , bash-. , — QA-. . ./tests.
  3. Report , Test, , GitLab Pages . GitLab Pages , ./public index.html. GitLab Pages .

    , :
    :

Em um exemplo de demonstração, um pipeline com testes de carga e duas fontes de carga (você pode desativar desnecessariamente) é semelhante a: O Apache JMeter pode gerar um relatório em HTML, por isso é mais rentável salvá-lo nas páginas do GitLab usando ferramentas regulares. É assim que o relatório do Apache JMeter se parece: Na demonstração do Yandex.Tank, você verá apenas um relatório de texto falso na seção Páginas do GitLab. Durante o teste, o Tank pode salvar os resultados no banco de dados do InfluxDB e, a partir daí, eles podem ser exibidos no Grafana (a configuração é realizada no arquivo ./tests/example-yandextank-test.yml ). É assim que o relatório de Tank se parece no Grafana:











Sumário


No artigo, falei sobre o conceito de "teste de carga como serviço" (teste de carga como serviço). A idéia principal é usar a infraestrutura de pools pré-configurados de agentes de carregamento, imagens de encaixe de fontes de carregamento, sistemas de relatórios e um pipeline que os une no GitLab CI com base em um modelo simples .gitlab-ci.yml (exemplo por referência ). Tudo isso é suportado por uma pequena equipe de engenheiros de automação e é replicado a pedido das equipes de produto. Espero que isso ajude você a preparar e implementar um esquema semelhante em sua empresa. Obrigado pela atenção!

PS: Gostaria de agradecer muito aos meus colegas Sergey Kurbanov e Nikolay Yusev, pela assistência técnica na implementação do conceito de teste de carga como serviço em nossa empresa.

Autor :Timur Gilmullin - deputado. Chefe de Tecnologia e Processos de Desenvolvimento (DevOps), Positive Technologies

All Articles