< Insights

DevOps e Testes Automatizados: por que andam sempre juntos? Ou deveriam…

  • DevOps

“Existem 3 práticas na engenharia de software onde o retorno sobre investimento é tão grande que entendo hoje serem práticas padrão: issue tracker, repositório de código e testes automatizados. Em particular, numa cultura DevOps, os testes funcionam como catalisadores exponenciais do sucesso das iniciativas. Para mim, iniciar DevOps sem testes é como mergulhar sem ter inspirado antes: você não vai chegar tão fundo…”

Humberto Soares, Co-Founder da Objective Solutions

Há tendências na área de desenvolvimento de soluções que vieram para ficar — ignorá-las é levar o seu negócio a sérios problemas para encantar o cliente e ficar atrás de concorrentes no mercado. E uma das mais importantes no momento, nesse contexto de transformação digital, é o DevOps.

A integração entre os setores de desenvolvimento e operações traz uma série de benefícios para o seu negócio e quando aplicado em conjunto com testes automatizados permite a obter todo o potencial necessário para seu negócio alavancar.

Neste artigo falaremos tudo que você precisa saber sobre essa união de DevOps e testes automatizados, e aproveitar para tirar suas principais dúvidas sobre o tema. Será como uma espécie de guia completo!

DevOps chegou para ficar

Fato é: o setor de TI não é mais o mesmo desde que o DevOps passou a ser implementado nas empresas de tecnologia. A verdade é que 73% das empresas já usam ou planejam implantá-lo nos próximos 12 meses, segundo o 13th annual State of Agile survey de 2018. E não é à toa:

Fonte: www.stateofagile.com

No gráfico acima, a mesma pesquisa mostra os principais benefícios da implantação de DevOps relatados pelas empresas. É possível reduzir o tempo de entrega, entregar com maior qualidade, melhorar a satisfação do cliente e, ao mesmo tempo, reduzir os custos empregados na produção. E isso só para citar alguns dos benefícios.

Por outro lado, até 2023, 90% das iniciativas DevOps falharão em atender as expectativas, não por razões técnicas, mas por causa de limitações nas abordagens das lideranças (fonte: Faun Community). E com a maior digitalização dos negócios, abrindo possibilidades para um maior número de empresas que trabalham com desenvolvimento, torna-se fundamental que as lideranças passem a saber como lidar com essa metodologia, para obter melhores resultados.

Será que estamos no caminho certo?

Infelizmente, muitos decisores ainda ficam com a impressão de que DevOps não passa de conto de fadas ou, pior, que ele só dificulta o desempenho do desenvolvimento. A realidade é que, na grande maioria das vezes, essa falsa impressão fica porque falharam devido à falta de um ingrediente básico na receita para a implantação do DevOps: ter testes automatizados consistentes.

Qualidade: a base de todo o processo

É muito provável que você já tenha se deparado com a figura a seguir:

Devops e Testes Automatizados

Essas são as etapas da produção de um software. O fluxo mostra desde o planejamento até o monitoramento, passando por todas as que fazem parte do cotidiano dos desenvolvedores e operadores. Vamos acrescentar agora as ferramentas que nos auxiliam em cada uma dessas fases:

Devops e Testes Automatizados

Adicionaremos as práticas de DevOps que vão otimizar esse processo:

Devops e Testes Automatizados

E, por baixo dessas práticas, há a base que sustenta toda essa intrincada estrutura: a qualidade.

Devops e Testes Automatizados

Testes unitários, funcionais, de interface gráfica, integrados — todos eles compõem a esfera da qualidade que viabiliza a produção sustentável de softwares. Viabiliza? Ué, como assim? Vamos exemplificar, com um caso real, as consequências de executar o processo de desenvolvimento sem automação de testes.

Caso real: processo sem automação de testes

Durante a implantação do DevOps, uma empresa de TI de grande sucesso automatizou todo seu pipeline, atingindo o tão desejado “continuous delivery”, porém sem ter antes se dedicado à automação de testes. Após a aplicação das mudanças, o líder técnico ficou, repentinamente, com muito mais trabalho.

Por quê? As mudanças no sistema entravam em produção mais rapidamente, porém cheias de bugs, o que fazia com que o líder técnico tivesse que voltar para versões antigas e lidar com a queda na satisfação do cliente.

Como esse problema foi encarado? Uma mudança simples foi implementada: o desenvolvedor passou a não conseguir commitar a feature sem antes passar por um teste automatizado. Se tentasse, ele receberia um aviso do sistema e o build não chegaria ao líder técnico. O trabalho foi consideravelmente reduzido e a qualidade das entregas foi melhorada.

Cuidado! Para não cair em armadilhas semelhantes e errar na aplicação das práticas de DevOps é preciso evitar as falácias comuns que circundam esse conceito.

Falácia: “DevOps é entrega contínua”

Como vimos no caso acima, reduzir DevOps à entrega contínua pode ter efeitos catastróficos. DevOps é mais que isso — pode ser visto como uma verdadeira mudança de cultura interna na empresa. Na realidade, as práticas de DevOps visam otimizar e se aplicam a cada etapa do processo de desenvolvimento de software, desde o planejamento até a entrega.

E, se tem uma lição que se pode tirar do exemplo tratado, é que entrega contínua não é sinônimo de entrega viável, ou sistema que funciona, sem bugs. Ele sozinho não leva a isso, sendo preciso implementar outras ferramentas que auxiliem nisso.

Maturidade em DevOps: testes desde o início

Há quem pense que testes automatizados são algo reservado a equipes com um alto grau de maturidade em DevOps. Ledo engano! É bem o contrário:

Devops e Testes Automatizados

Fonte: coe.aceinfosolutions.com

Esse quadro, bastante difundido em blogs e fóruns, mostra os graus de maturidade em DevOps pelos quais um time passa. Logo no estágio inicial de maturidade (“Initial”), pode-se ver que há Testes Unitários Automatizados (“Automated Unit Tests”) na linha “Tests & Verifications”. Ou seja, mesmo no primeiro estágio de maturidade em DevOps, exige-se a realização de testes automatizados.

E faz sentido, pois se não for possível esse passo inicial, não conseguiremos gerar releases frequentes, já que eles estarão quebrados com regularidade. Também não é possível automatizar o lançamento de versões, pois os scripts terão altos índices de erros.

Enfim, sem um grau mínimo de testes automatizados, não é possível avançar para os próximos níveis de maturidade.

Sem a aplicação deles, logo nas etapas iniciais, o processo será, em geral, mais custoso e gerará menos valor, porque será de baixa confiabilidade.

Mais algumas práticas DevOps e Testes Automatizados

Vimos como são fundamentais os testes automatizados para continuous deploy, integration e delivery; mas como ele apoia as outras práticas de DevOps? Vejamos agora algumas dessas práticas onde a automação de testes faz toda a diferença:

ATDD (Acceptance Tests Drive Design)

É possível dar um boost na produtividade da sua equipe automatizando os seus testes de aceitação. Com ferramentas como o Cucumber, você pode automatizar as validações funcionais com mais facilidade, reduzindo a quantidade de trabalho investida e aumentando a qualidade do sistema.

Issue Tracking

Assim como é possível associar o código a uma issue específica no seu repositório (issue tracker), também é possível relacionar um teste automatizado a uma feature específica. Desse modo, você consegue traquear quais testes estão sendo realizados, quais features cada um está testando e se o teste expressa o que a issue está descrevendo, entre outras coisas. Isso aumenta consideravelmente a qualidade do seu projeto, otimizando seus custos e o tempo de entrega.

Previsibilidade

Trabalhar em bugs de features passadas atrasa a sua entrega e pode afetar a sua receita no final do projeto. Com testes automatizados, você diminui a incidência tanto de bugs simples e rápidos de se resolver quanto dos complexos e demorados para se solucionar. Testes automatizados são sinônimo de projeto finalizado dentro da previsão.

Além disso, equipes com uma boa cultura em testes automatizados conseguem ver uma feature em função da quantidade de testes necessários para ser validada. Esse é um elemento tangível para entender o progresso do seu projeto, que o torna mais previsível.

Refactoring

Testes automatizados são ótimos aliados na melhoria do design do código, mantendo o comportamento. Os testes, quando bem feitos, validam o comportamento do código, dizendo como o sistema deve se comportar. Com uma bateria de testes automatizados, o desenvolvedor pode ter a tranquilidade de mudar o código, minimizando o risco de incluir um bug, sem medo de quebrar o sistema.

Essa é uma pequena amostra de como DevOps depende da automação de testes. Para prosseguir, antes de entrarmos nas dicas para a aplicação de testes automatizados, vamos conceituar seus principais tipos para eliminar a possibilidade de confundirmos uns com os outros.

Mais práticas interessantes para garantir testes contínuos em DevOps

Além de tudo que já falamos anteriormente, ainda há outras práticas interessantes que são importantes para garantir testes contínuos em DevOps. Vamos mostrar a seguir alguns pontos que podem ser fundamentais para a implementação dos testes em DevOps.

Assegure-se de ter uma base completa para automatização de testes

Um primeiro ponto a ser observado é garantir se há uma plataforma de base que consiga gerar a automatização dos testes de forma eficiente. Caso ainda não tenha, é importante realizar uma implantação estrutural em seu negócio, por meio de um planejamento específico para esse fim, de forma a minimizar impactos significativos nas rotinas internas.

Isso é fundamental para garantir continuidade nos processos e deve ser realizado durante todo o processo de entrega, a fim de analisar e validar a arquitetura da solução que etá sendo desenvolvida.

Para isso, é fundamental contar com uma plataforma robusta e sólida, que permita:

  • gravar testes de unidades;
  • analisar quais são os testes que passaram e quais falharam;
  • o sistema de testes deve ser capaz de realizar todas as ações para criar uma compilação funcional do software após todos os testes.

Considere o uso de BDD

O BDD (Behaviour Driven Development, ou Desenvolvimento Orientado por Comportamento) diz respeito a uma técnica de métodos ágeis que tem por objetivo fazer a integração de regras de negócio e linguagem de programação, permitindo, assim, a melhorar o comportamento do software, auxiliando a melhorar os testes. Alguns especialistas afirmam que esse seria a evolução do TDD (Test Driven Development, ou Desenvolvimento Orientado a Testes).

Assim, nessa técnica, primeiro se escreve o teste a ser realizado e, depois, prepara-se o código — torna-se, assim, um código orientado por testes. Assim, o objetivo é focar nas linguagens e interações. Adotar essa técnica tem os seguintes benefícios:

  • melhora a comunicação em equipes;
  • permite o compartilhamento de conhecimento;
  • permite uma documentação dinâmica;
  • gera uma visão do todo do processo de desenvolvimento, operações e testes.

O BDD se adéqua bem a mentalidade de testes contínuos, podendo ser uma solução interessante, principalmente, por incentivar a colaboração contínua dos product owners, desenvolvedores e testadores.

Capacite as equipes de Quality Assurance

Os testes são mais eficientes tanto quanto seus times de QA sejam qualificados para as atividades. Por isso, é fundamental que seu negócio visualize sempre estimular a capacitação contínua dos colaboradores focados nessa função.

Isso porque os times de Quality Assurance são responsáveis por gerenciar as questões relacionadas com a garantia de qualidade das soluções — o que envolvem, consequentemente, os testes automatizados. É importante frisar que a qualificação não precisa ser, necessariamente, na área de qualidade. Isso porque os colaboradores precisam ter conhecimento, também, sobre desenvolvimento de softwares, o funcionamento dos negócios no modelo DevOps, entre uma série de outras questões que influenciam no seu trabalho. Assim, é possível que possam atuar, de forma consistente, em todo o ciclo de vida da solução.

Seja analítico sobre testes automatizados

A automação é, de fato, interessante, contudo, é um desperdício ter um pensamento de que deve fazer isso em todos os processos. Isso porque há situações nas quais pode-se ser mais interessante realizar o processo de forma manual. Em alguns casos, escrever testes automatizados pode ser mais custoso e complexo do que sua realização de forma manual. Para isso, é importante ter, também, equipes que tenham conhecimento e expertise sobre o tipo de aplicação que está sendo usado, bem como sobre a base de usuários.

Evite erros nos testes contínuos automatizados

Também é fundamental pensar em quais são os principais erros existentes na realização dos testes contínuos. Isso porque as consequências de problemas nesse ponto podem ser complicados, tais como:

  • aumento da carga de trabalho para os colaboradores dos times de DevOps;
  • gera divisões dentro dos times, o que pode prejudicar, justamente, a concepção integrada de DevOps;
  • gera interrupções drásticas na entrega contínua de valor para o cliente;
  • gera pouco espaço para inovação, já que os testes automatizados permitem criar produtos e garantem que o que estava em produção continue funcionando;
  • propicia maior dificuldade para detectar erros.

Assim, veja a seguir quais são os principais erros que ocorrem na adoção de testes contínuos automatizados:

  • feedback lento ou não confiável dos testes. Se a automação não oferece as informações necessárias para intervir, você não saberá o que deve ser modificado. Por exemplo, a pipeline de testes automatizados quebra, mas a razão da quebra não é confiável pelo feedback. Como você vai ser em que ponto precisa intervir?
  • falta de integração do código com o repositório pelo menos uma vez por dia, gerando acúmulo de código local;
  • rodar os testes em ambientes compartilhados, aumentando os riscos na execução da atividade. Isso porque, caso ocorra algum tipo de alteração no ambiente para outras questões, pode gerar falsos negativos no teste, gerando perda de confiança dos times nos processos de automação.

Eliminando confusões: os principais tipos de testes

Para que você evite erros e confusões na adoção dos testes automatizados, confira quais são os principais adotados pelas empresas a seguir. 

Testes unitários

São testes de unidades ou componentes individuais de um programa: as menores partes testáveis do software. Geralmente têm apenas um ou poucos inputs e outputs. Trata-se do primeiro nível de automação de testes e é geralmente feito sob o nível de métodos.

Testes funcionais

São aqueles pelos quais o sistema é testado contra as especificações ou requisitos funcionais. Neles, as funções são testadas por meio da entrada de inputs e do exame de outputs. Eles acabam por garantir que os requisitos sejam satisfatoriamente cumpridos. Esses testes são também chamados de end-to-end. 

Testes de interface de usuário (GUI)

Graphical User Interface é a interação com o computador por meio de imagens em vez de texto. Testes de interface de usuário são, então, aqueles que envolvem checar as telas com controles, como menus, botões, ícones etc.

Testes integrados

São testes nos quais se validam a integração de módulos ou sistemas. O objetivo é garantir que a interface do sistema esteja de acordo com a especificação e que os sistemas estão se conversando conforme o esperado. São um pouco mais complexos de se executar, uma vez que dependem de se ter mais de um sistema no ar. É o tipo onde mais se usam técnicas de Mocking.

Cuidado para não confundir!

Muitas equipes acabam tendo problemas que inviabilizam o DevOps por confundirem testes funcionais, de interface de usuário e integrados. Um teste funcional pode ser rodado independentemente de um teste de interface, que é algo pesado, mais demorado e de alto custo. Mas, se trocar as bolas e dizer que um é o outro, torna-se muito mais difícil praticar a automação de testes. 

A arquitetura do sistema deve ser pensada para permitir a aplicação destes três tipos de testes simultaneamente. Em vista disso, uma das práticas de engenharia de software mais indicadas é não deixar regras de negócios dentro do código de interface do sistema; dessa forma, é possível fazer com que os testes e as telas do sistema consigam invocar o mesmo código das classes de negócio.

Tipos de teste mais importantes para DevOps

Entre os tipos que conceituamos acima, os mais importantes para o DevOps certamente são os testes de integração e funcionais. Os unitários, por serem testes em trechos pequenos, são de maior importância durante a etapa de desenvolvimento, onde o programador pode ter um feedback quase que imediato do trechinho que está desenvolvendo.

Já os de integração e os funcionais, por serem tipicamente black-box, são mais abrangentes, varrendo trechos bem grandes do sistema. Assim, eles garantem que o desenvolvedor não o quebrará enquanto mexe em parte do código. Nesse sentido, ao contrário dos unitários, os funcionais e de integração têm mais valor para o processo como um todo, e não só na etapa de desenvolvimento.

Outra vantagem desses dois tipos para DevOps é que, exatamente por serem de amplo escopo de testes, é possível ver no seu vasto conjunto se o seu design está sendo melhorado e se o seu comportamento está sendo mantido. Ou seja, são um ótimo auxílio para a prática de refactoring.

Dicas para começar com Testes Automatizados

A principal dica que damos para iniciar uma cultura de testes automatizados é adotar um processo de melhoria contínua, iniciando com metas localizadas. A ideia é sempre diminuir o impacto da adoção e aumentar a chance de sucesso.

Criar um conjunto inicial de testes regressivos para o sistema atual

A ideia é ter um esforço dedicado para criar uma suíte básica de testes do seu sistema, minimizando o impacto nos outros projetos que já estão acontecendo. Com isto, você conseguirá avaliar as ferramentas escolhidas e a produtividade do seu time em desenvolver testes.

Essa suite inicial também ajudará a entender o impacto da adoção nas outras atividades, uma vez que garantir que todos os testes farão parte do dia a dia do time. Após a construção desse conjunto inicial, é interessante manter um tempo dedicado a aumentar a cobertura destes testes, com foco nas áreas críticas do sistema: as áreas que sofrem mais alterações ou contém mais bugs.

Test-Driven Bugfixing (TDB)

Aplicar TDD (Test Driven Development) é um desafio considerável para desenvolvedores. Isto porque a maioria está habituada a fazer o teste como a parte final do processo de desenvolvimento e não iniciar por ele. Assim, escrever primeiro um teste que falha e depois desenvolver o código que o fará “passar”, é uma atividade anti-natural.

Para facilitar a transição, sugerimos adotar o TDD para correção de bugs. O bug é por natureza um cenário do sistema que falha. Então, replicá-lo por meio de testes automatizados é uma atividade bem natural para o desenvolvedor. Desta forma, assim que identificado um bug no sistema, adote o seguinte procedimento:

  1. Escreva um teste automatizado que replique o bug;
  2. Execute o teste que quebrará, como esperado;
  3. Corrija o bug;
  4. Execute o teste e veja se dessa vez passa.

Com isto, você tem 3 ganhos claros:

  1. Um critério objetivo para validar que um bug foi corrigido;
  2. Evita que o mesmo bug ocorra no futuro por conta de outras alterações no código;
  3. Facilita a transição do time para utilizar TDD em outras atividades de desenvolvimento.

Conclusão

Adotar uma cultura de melhoria contínua significa que seus processos, ferramentas e pessoas estarão em constante mudança. Dentro deste caos, uma suíte de testes automatizados age como um invariante, algo que precisa ser constante, independentemente das alterações: a qualidade do código.

Ao adotar DevOps, você acelerará a entrega de novas funcionalidades. E se o processo de garantia de qualidade for manual, ou ele se transformará em gargalo, inviabilizando a aceleração esperada, ou ele será reduzido, diminuindo a qualidade da entrega

Por outro lado, com testes automatizados, quanto mais vezes eles são executados, maior o número de bugs que eles evitarão. Ou seja, se por um lado os testes viabilizam DevOps, por outro DevOps potencializa o retorno sobre o investimento dos testes automatizados.

Então, a melhor dica que você pode obter neste material é investir em testes automatizados dentro do seu processo de desenvolvimento de software. Em pouco tempo, você colherá os frutos dessa importante decisão: aumento da qualidade da entrega, aumento da previsibilidade, segurança para refactoring, redução de custos e aumento da satisfação dos clientes. Tudo isso se traduzindo em maiores lucros para a sua empresa e no seu sucesso pessoal.

Gostou do nosso artigo? Então, aproveite e compartilhe-o em suas redes sociais para levá-lo a outras pessoas que tenham interesse neste tema.

New call-to-action

Insights do nosso time

Obtenha insights do nosso time de especialistas sobre metodologias de desenvolvimento de software, linguagens, tecnologia e muito mais para apoiar o seu time na operação e estratégia de negócio.