O conceito Continuous Integration/Continuous Delivery (CI/CD) é muito utilizado e discutido entre as equipes que atuam com desenvolvimento de software.
Esta abordagem surgiu a partir da necessidade de os softwares receberem atualizações mais rápidas, ao mesmo tempo que apresentam cada vez menos defeitos. Construir um bom pipeline de CI/CD é um desafio gigantesco e as etapas que são automatizadas utilizando estes processos – como os testes unitários, integrados, funcionais, end-to-end (E2E) e de performance – garantem maior confiabilidade nas alterações do código, tornando as entregas mais rápidas e seguras.
O que é Continuous Integration?
Por ser mais popular entre os projetos com atualizações frequentes, a Integração Contínua (traduzida do termo em inglês “Continuous Integration”, ou CI) exerce o papel fundamental de garantir que cada componente funciona perfeitamente (tanto individualmente, como quando integrado), rodando as automações com alta frequência, seja uma vez ao dia ou de hora em hora.
Na prática, os desenvolvedores constroem e testam o código localmente antes de enviar o que foi desenvolvido para o repositório e, uma vez que essas alterações chegam ao repositório, é iniciada automaticamente uma sequência de etapas.
A primeira etapa, mais comum, é a construção do código mais recente do código-fonte. Se tudo correr bem, são iniciados os testes unitários. Se correrem bem, é iniciado o build para os ambientes de testes e, no final de cada etapa, é gerado um relatório detalhado com o status do processo, exibindo o número de compilações feitas, defeitos que possam ter ocorrido e o total de testes realizados.
Para exemplificar melhor este flow, um pipeline de CI executa as seguintes tarefas:
- Detetar as alterações no repositório de código-fonte (ex.: os novos commits aparecem);
- Analisar a qualidade do código-fonte;
- Construção, a cada job, de uma nova versão do código-fonte;
- Execução de testes unitários;
- Execução de testes integrados;
- Construção de artefatos implementáveis;
- Relatório de status.
O que é Continuous Delivery?
A Entrega Contínua (tradução de “Continuous Delivery”, ou CD), é uma sequência do que ocorreu na etapa de CI. Ambas se conectam, porque enquanto a CI trata da construção e dos testes, a CD trata de como implementar todos esses pacotes.
Antes da implementação de uma nova funcionalidade, a Continuous Delivery contempla um flow que inclui testes automatizados, unitários, testes de API e testes de carga e integração. Cada etapa é realizada de forma automática, garantindo testes automatizados a nível unitário, de integração e sistêmico. Como os testes podem falhar em qualquer nível e ambiente, o CI/CD deve garantir uma forma de relatar rapidamente as falhas aos desenvolvedores.
Dependendo das políticas e dos processos definidos pelas equipes, os desenvolvedores podem seguir estes passos:
- Antes de confirmarem as alterações, os desenvolvedores precisam verificar se a compilação atual do código foi bem-sucedida. Caso contrário, devem corrigir os erros e só depois enviar novas alterações;
- Se a compilação atual for bem-sucedida, devem redefinir a estação de trabalho com a configuração da compilação;
- Criar e testar localmente para garantir que a atualização não quebra nenhuma funcionalidade. Se for bem-sucedido, basta o time confirmar as novas alterações;
- Garantir que o CI é concluído com novas alterações;
- Se a compilação falhar, os desenvolvedores devem interromper e corrigir os erros no ambiente local, para então voltar à etapa 3;
- Se a compilação for aprovada, o time segue trabalhando em outros itens para implementar futuramente.
O que são testes em CI/CD?
É a fase em que se garante a qualidade na entrega com o mínimo de erros possível.
O objetivo é promover a atualização ou o lançamento somente quando passar nos testes de requisitos funcionais, permanecer estável e livre de defeitos. Normalmente, é um processo automatizado totalmente integrado no pipeline.
Como é que testes em CI/CD se encaixam no processo CI/CD?
É bem mais fácil resolver e corrigir problemas enquanto eles ainda estão na base. Este tipo de ação impede que os códigos se multipliquem sobre uma base instável, o que acaba por reduzir o tempo e esforço na resolução de eventuais erros.
Atualmente, as ferramentas de teste automatizado têm total aderência com as ferramentas de CI/CD, permitindo que os dados de teste sejam alimentados diretamente no pipeline. Dependendo da ferramenta utilizada, podemos definir se seguiremos para a próxima etapa de teste com base nos resultados dos testes anteriores, garantindo que a cada etapa a equipe receba um report com os resultados informando o step seguinte.
Para garantir maior eficiência no pipeline, é recomendável montar a suíte de testes colocando os mais rápidos à frente dos mais complexos – assim pode ganhar-se mais tempo nas entregas.
Traçando estratégias na criação dos testes, temos de ter em mente a estrutura da pirâmide de testes, onde equilibramos os testes unitários, os de integração e os end-to-end.
Essa abordagem bem estruturada para testes de CI/CD garante uma cobertura abrangente, mantendo a eficiência e a eficácia durante todo o ciclo de vida de desenvolvimento de software.
Ferramentas que permitem testes em CI/CD
Existem diversas ferramentas que permitem a utilização e práticas de testes em CI/CD, mas as mais populares são:
- Selenium
É a plataforma mais popular para criar testes automatizados em ambientes web. Oferece suporte a várias linguagens de programação (como Java, Python e C#). O Selenium integra-se bem com pipelines de CI/CD e pode ser combinado com outras ferramentas como o Selenium Grid para execução paralela. - Jenkins
Conhecido principalmente como uma ferramenta de CI/CD, o Jenkins também oferece suporte à automação de testes. Fornece plug-ins para integração com várias estruturas de teste, incluindo Selenium, JUnit e TestNG. Jenkins pode executar testes automatizados como parte do pipeline de CI/CD e gerar relatórios para resultados de testes. - Cucumber
É uma ferramenta usada para desenvolvimento orientado a comportamento (Behavior-Driven Development – BDD) e automação de testes. Permite a colaboração entre desenvolvedores, testadores e partes interessadas de negócios por meio do uso de especificações executáveis em texto simples, chamadas Gherkin. O Cucumber oferece suporte à integração com ferramentas de CI/CD como Jenkins, permitindo que testes automatizados sejam executados como parte do pipeline.
Descobre mais sobre Cucumber Testing neste artigo!
- Appium
É uma estrutura de automação de código aberto projetada especificamente para automatizar testes para aplicativos móveis. Suporta plataformas Android e iOS, e permite escrever testes usando linguagens de programação populares como Java, Python e Ruby. O Appium pode ser integrado a pipelines de CI/CD para automatizar testes de aplicativos móveis em vários dispositivos e plataformas.
Testes automatizados vs. manuais
Quando falamos de testes CI/CD, todo o tipo de teste é válido, tanto manual, quanto automático. O facto é que o teste manual exige que o QA (Quality Assurance) tenha uma perceção apurada e veja diferentes formas de testar uma aplicação, garantindo a harmonia entre critérios simples como funcionalidade, usabilidade, acessibilidade e performance.
No entanto, em situações em que seja necessário testar um número elevado de cenários, o que acaba por aumentar as chances de erro humano decorrente da perda de atenção nos testes ou no próprio controle, isso pode vir a ser um fator que aumenta o tempo dos testes. Daí a importância de testes automatizados, pois podemos alimentar casos de testes repetitivos e complexos, economizando o tempo dos QA.
Os testes automatizados aceleram os ciclos de feedback ao verificar continuamente o código. É importante automatizar o máximo possível o processo de teste. Essa abordagem é adequada para executar grandes conjuntos de testes repetitivos e detetar regressões prontamente. Os tipos de testes que podem ser integrados como parte dos ciclos CI/CD são testes de unidade, testes de integração, testes de sistema e testes de regressão.
Como nem todos os casos de teste podem ser automatizados, é sempre recomendado uma abordagem que combine testes manuais e automatizados para garantir a entrega contínua.
Benefícios de CI/CD
Ao implementarmos pipelines de testes no fluxo de CI/CD, garantimos uma maior assertividade nos testes, pois reduzimos os tempos regressivos, garantimos uma maior qualidade do software e ganhamos tempo na resolução de bugs.
Otimizando estas etapas, abrimos mais espaço para que as equipes explorem a criatividade, trazendo insights acerca do produto e permitindo que os indivíduos tragam mais inovações.
Eis alguns dos principais benefícios da aplicação dos conceitos de CI/CD ao desenvolvimento de um produto de software:
- Qualidade e segurança do código;
- Aumento na taxa de satisfação dos clientes;
- Aumento na velocidade das entregas, decorrente de pipelines bem definidos e estruturados;
- Com automações bem definidas, o time pode focar melhor em outros assuntos;
- Um pipeline bem definido traz produtos mais robustos e com mais qualidade, atraindo bons talentos e grandes clientes.
Conclusão
Bom, chegámos à conclusão de que com pipelines de testes bem definidos, o time consegue desempenhar um papel fundamental para garantir uma entrega eficiente e com qualidade.
CI/CD são duas práticas recomendadas de DevOps, pois abordam o desalinhamento entre os desenvolvedores e a equipe operacional. Com a presença da automação, os desenvolvedores podem lançar alterações e novos recursos com mais frequência, enquanto as equipes de operação têm melhor estabilidade geral.