Fechar

Continuous integration, explained

Construa a agilidade da sua equipe com feedback mais rápido. Porque você só se move tão rápido quanto seus testes.

Nothing builds–or destroys–agility like a team's commitment to continuous integration (CI). That might sound ominous (especially if your team has yet to embrace CI), but there's good news. Regardless of the technologies a team uses, chances are there's a continuous integration and automated test framework that will work for their code base. Here's what you need to know before you dive into the detail.

Continuous integration articles

[CONTINUED]

Integração contínua

Integração contínua é a prática de integrar, rotineiramente, alterações de código na ramificação principal de um repositório e testar as alterações, o mais cedo e frequente possível. Idealmente, os desenvolvedores integrarão seus códigos diariamente, se não várias vezes ao dia.

Automated testing, continuous delivery, and continuous deployment

It is important to distinguish continuous integration from automated testing as well as continuous delivery and continuous deployment. While those development practices relate to each other, they differ essentially by how the code gets deployed to production.

Automated testing

Automated tests are tests that can be run without the need of human intervention in a repeatable way, at any time. You typically have to write down a script to test some assertions or validate the behaviour of your application. The script is then run by a machine which provides the results as an output. Automated testing is a key part of CI, but it is not enough by itself.

Serviço constante

You practice continuous delivery when your codebase is always deployable, ready to go to production in one click. While it is recommended to deploy to production as soon as you get a green build, you may decide to slow down the releases on purpose for business reasons.

Implementação contínua

Continuous deployment happens when every change to the main branch that passes the CI tests gets pushed to production without the need for human interaction. This often results in many deployments per day which provide fast feedback to the development team.

Benefícios da integração contínua

Investing in CI results in fast feedback on code changes. Fast as in "within minutes" fast. A team that relies primarily on manual testing may get feedback in a couple hours, but in reality, comprehensive test feedback comes a day–or several days–after the code gets changed. And by that time more changes have occurred, making bug-fixing an archeological expedition with developers digging through several layers of code to get at the root of the problem.

Isso definitivamente não é rápido.

As equipes ágeis fornecem softwares de qualidade rapidamente, sem precisar de esforços desnecessários. A CI torna isso possível.

Proteja a qualidade com compilações contínuas e automação de teste

Quantos de nós já baixou o código fonte mais recente e percebeu que ele não compilava ou tinha um erro significativo? Isso destrói a produtividade!

Duas práticas podem nos manter longe dessa situação:

Compilações contínuas: compilar o projeto assim que uma alteração for feita. Idealmente, o delta entra cada compilação é um conjunto com uma única alteração.

Test automation: Programatic validation of the software to ensure quality. Tests can initiate actions in the software from the UI (more on that in a moment), or from within the backend services layer.

Pense nessas duas práticas como manteiga de amendoim e geleia: são bons separadamente e melhor juntos! A integração contínua unifica compilações contínuas com automação de teste para garantir que cada compilação também avalie a qualidade da base de código.

And remember: to fully realize the benefits, a team must also have the discipline to pause development and address breakages right away. The energy a team invests (and make no mistake: it's an investment) in writing tests and configuring the automation is all for naught if builds are allowed to languish in a broken state. Protecting the investment in CI and protecting the quality of the code base are one and the same thing. 

Testes em CI: unidade, API e testes funcionais

As execuções de CI têm duas fases principais. A etapa um garante a compilação do código. (Ou, no caso de linguagens interpretadas, simplesmente reúne todas as partes.) A etapa dois garante que o código funcione do modo esperado. O modo mais seguro de fazer isso é com uma série de testes automatizados que validam todos os níveis do produto. 

Testes de unidade

Benefícios: fácil de escrever, rápido de executar, modela de perto a arquitetura da base de código.

Desvantagens: os testes de unidade validam apenas os componentes principais do software. Eles não refletem os fluxos de trabalho do usuário que, normalmente, envolvem vários componentes em execução ao mesmo tempo.

Como um teste de unidade explica como o código deve funcionar, os desenvolvedores podem revisar testes de unidade para se atualizarem em relação à área do código. 

Testes de API

Um software bom é modular, o que permite uma separação mais clara do trabalho em vários aplicativos. As APIs são os pontos de extremidade nos quais diferentes módulos se comunicam uns com os outros, e os testes de API fazem a validação deles com chamadas de um módulo para o outro.

Benefits: Generally easy to write, run fast, and can easily model how applications will interact with one another.

Desvantagens: em áreas simples do código, os testes de API podem imitar alguns testes de unidade.

Como as APIs são interfaces entre partes do aplicativo, elas são especialmente úteis ao preparar-se para uma liberação. Quando uma compilação candidata à liberação é aprovada em todos os testes de API, a equipe consegue ser muito mais eficiente na entrega aos clientes.

Testes funcionais

Testes funcionais são feitos em grandes áreas da base de código e modelam os fluxos de trabalho do usuário. Nos aplicativos web, por exemplo, o HTTPUnit e o Selenium interagem diretamente com a interface do usuário para testar o produto.

Benefícios: mais probabilidade de encontrar erros, pois imitam as ações do usuário e testam a interoperabilidade de vários componentes.

Drawbacks: Slower than unit tests, and sometimes report false negatives because of network latency or a momentary outage somewhere in the technology stack.

As equipes, normalmente, percebem que, quando se aproximam do fluxo de trabalho real do usuário, a velocidade da execução dos testes automatizados diminui. O HTTPUnit é mais rápido porque não é um navegador web completo. O Selenium somente pode ser executado na mesma velocidade que o navegador web, mas tem a vantagem de ser executado em vários navegadores web em paralelo. Apesar disso, os testes funcionais são muito valiosos e fornecem feedback muito mais rapidamente do que testadores humanos.

Falando nisso...

Alguns testadores veem os testes automatizados como uma ameaça existencial. Esse pensamento está longe da verdade. Ao não precisarem executar tarefas de teste repetitivas, os testadores podem passar o tempo trabalhando na análise de risco, no planejamento de teste e na criação de outras habilidades – como aprendendo a codificar! 

Torne sua integração contínua rápida

Na Atlassian, tentamos manter os desenvolvedores inovando e nossas bases de código funcionando. Colocamos muita ênfase no "ciclo de feedback interno" do desenvolvedor – o tempo necessário para fazer alterações e obter resultados de testes.

Executar testes automatizados pode, rapidamente, adicionar e prolongar a duração da compilação. Uma estratégia é colocar os testes automatizados em paralelo em vários servidores, ou "agentes de compilação", para que o servidor de CI realmente execute 2, 20 ou até mesmo 200 testes simultaneamente. Com as tecnologias de nuvem, a CPU pode ser facilmente escalada para atender as necessidades da sua equipe de desenvolvimento à medida que os conjuntos de testes aumentam. No entanto, a CPU não é ilimitada. Teste cada área do código completamente, mas não de modo redundante. Testes redundantes aumentam a duração da compilação (e desperdiçam CPU). Quanto mais rapidamente os engenheiros recebem a aprovação, mais rapidamente eles conseguem ir para o próximo item da lista de pendências. 

Ramificação e CI: uma incrível combinação!

Muitas equipes evitam a criação de branches porque merges são difíceis. Com tecnologias mais recentes no controle de versão, como Git, a criação de branches e merging ficaram mais fáceis. Para garantir que a linha de código primária ("mestre" na linguagem Git) permaneça íntegra, execute o mesmo nível de integração contínua em todos os branches de versão estável e desenvolvimento. Quando o build passa por um branch, a equipe tem confiança para mesclar o código na cadeia produtiva.

With branching, continuous integration, and test automation, teams can be productive and innovative while still protecting code quality. If you're ready to take the next steps, check out our step-by-step guide to getting started with CI.

Esse é o desenvolvimento ágil no seu melhor: fornecimento de software de trabalho regularmente, com débito técnico mínimo e sem comprometer a criatividade.

Dan Radigan
Dan Radigan

Tive um enorme impacto pelo Agile, tanto profissionalmente como pessoalmente, pois eu aprendi que as melhores experiências são ágeis, no código e na vida. Muitas vezes você me na encruzilhada da tecnologia, fotografia e motociclismo. Siga-me no Twitter! @danradigan