

# Estágios de teste em integração e entrega contínuas
<a name="testing-stages-in-continuous-integration-and-continuous-delivery"></a>

 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. 

![\[alt text not found\]](http://docs.aws.amazon.com/pt_br/whitepapers/latest/practicing-continuous-integration-continuous-delivery/images/image8.png)


* 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
<a name="setting-up-the-source"></a>

 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 name="setting-up-and-running-builds"></a>

 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\$1\$1
+ 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
<a name="building"></a>

 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
<a name="staging"></a>

 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
<a name="production"></a>

 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](deployment-methods.md). 

 A próxima seção discute a criação do pipeline para incorporar esses estágios e testes. 