Estágios de teste em integração e entrega contínuas
As três equipes de CI/CD devem incorporar testes ao ciclo de vida de desenvolvimento de software nos diferentes estágios do pipeline de CI/CD. No geral, os testes devem começar o mais cedo possível. A pirâmide de teste a seguir é um conceito fornecido por Mike Cohn em Aplicando métodos ágeis com sucesso. Ela mostra os vários testes de software em relação ao custo e à velocidade com que são executados.
Pirâmide de testes de CI/CD
Os testes de unidade estão na parte inferior da pirâmide. Eles são os mais rápidos de executar e os mais baratos. Portanto, os testes de unidade devem constituir a maior parte da sua estratégia de teste. Uma boa regra prática é de cerca de 70%. Os testes de unidade devem ter cobertura de código quase completa porque os bugs capturados nessa fase podem ser corrigidos de forma rápida e barata.
Os testes de serviço, componente e integração estão acima dos testes de unidade na pirâmide. Esses testes exigem ambientes detalhados e, portanto, são mais caros em requisitos de infraestrutura e mais lentos para serem executados. Os testes de performance e conformidade são o próximo nível. Eles exigem ambientes de qualidade de produção e ainda são mais caros. Os testes de aceitação da interface do usuário e do usuário estão no topo da pirâmide e exigem ambientes de qualidade de produção também.
Todos esses testes fazem parte de uma estratégia completa para garantir um software de alta qualidade. No entanto, para velocidade de desenvolvimento, a ênfase está no número de testes e na cobertura na metade inferior da pirâmide.
As seções a seguir discutem os estágios de CI/CD.
Configuração da fonte
No início do projeto, é essencial configurar uma fonte na qual você possa armazenar o código bruto e as alterações de configuração e esquema. No estágio de fonte, escolha um repositório de código-fonte, como um hospedado no GitHub ou o AWS CodeCommit.
Configuração e execução de compilações
A automação da compilação é essencial para o processo de CI. Ao configurar a automação da compilação, a primeira tarefa é escolher a ferramenta de compilação correta. Existem muitas ferramentas de compilação, como:
-
Ant, Maven e Gradle para Java
-
Make para C/C++
-
Grunt para JavaScript
-
Rake para Ruby
A ferramenta de compilação que funcionará melhor para você depende da linguagem de programação do projeto e do conjunto de habilidades da equipe. Depois de escolher a ferramenta de compilação, todas as dependências precisam ser claramente definidas nos scripts de compilação, juntamente com as etapas de compilação. Também é uma prática recomendada fazer a versão dos artefatos de compilação finais, o que facilita a implantação e o controle dos problemas.
Desenvolvimento
No estágio de compilação, as ferramentas de compilação receberão como entrada qualquer alteração no repositório de código-fonte, compilarão o software e executarão os seguintes tipos de testes:
Teste de unidade: testa uma seção específica do código para garantir que ele faça o que é esperado. O teste de unidade é realizado por desenvolvedores de software durante a fase de desenvolvimento. Nesse estágio, podem ser aplicados uma análise de código estático, análise de fluxo de dados, cobertura de código e outros processos de verificação de software.
Análise de código estático: esse teste é realizado sem realmente executar a aplicação após o teste de compilação e unidade. Essa análise pode ajudar a encontrar erros de codificação e falhas de segurança, além de garantir a conformidade com as diretrizes de codificação.
Preparação
Na fase de preparação, são criados ambientes completos que espelham o ambiente de produção eventual. Os seguintes testes são realizados:
Teste de integração: verifica as interfaces entre os componentes em relação ao design do software. O teste de integração é um processo iterativo e facilita a compilação de interfaces robustas e integridade do sistema.
Teste de componentes: testa a transmissão de mensagens entre vários componentes e seus resultados. Um dos principais objetivos desse teste pode ser a idempotência no teste de componentes. Os testes podem incluir volumes de dados extremamente grandes ou situações de borda e entradas anormais.
Teste do sistema: testa o sistema de ponta a ponta e verifica se o software atende aos requisitos empresariais. Isso pode incluir o teste da interface do usuário (UI), da API, da lógica de backend e do estado final.
Teste de performance: determina a capacidade de resposta e a estabilidade de um sistema conforme ele é executado em uma workload específica. O teste de performance também é usado para investigar, medir, validar ou verificar outros atributos de qualidade do sistema, como escalabilidade, confiabilidade e uso de recursos. Os tipos de testes de performance podem incluir testes de carga, testes de estresse e testes de pico. Os testes de performance são usados para testes comparativos com relação a critérios predefinidos.
Teste de conformidade: verifica se a alteração do código está em conformidade com os requisitos de uma especificação e/ou regulamentos não funcionais. Ele determina se você está implementando e atendendo aos padrões definidos.
Teste de aceitação do usuário: valida o fluxo de negócios de ponta a ponta. Esse teste é executado por um usuário final em um ambiente de preparação e confirma se o sistema atende aos requisitos da especificação do requisito. Normalmente, os clientes empregam metodologias de teste alfa e beta nesse estágio.
Produção
Por fim, depois de passar nos testes anteriores, a fase de preparação é repetida em um ambiente de produção. Nessa fase, um teste canary final pode ser concluído implantando o novo código somente em um pequeno subconjunto de servidores ou até mesmo em um servidor, ou uma Região da AWS antes de implantar o código em todo o ambiente de produção. Os detalhes sobre como implantar com segurança na produção são abordados na seção Métodos de implantação.
A próxima seção discute a criação do pipeline para incorporar esses estágios e testes.