Inter e Intra #3.2 – Testes Unitários!

Bem vindos de volta, galera!
 
Para fechar o ano com chave de ouro, vamos fechar a terceira parte do nosso projeto Inter e Intra… vamos colocar os testes unitários para rodar! 😎
A galera da empresa já está em clima de Natal! 😂
Dando uma relembrada do que já fizemos:
  1. Na primeira parte, montamos o nosso repositório, criamos os diretórios e definimos as separações dos módulos.
  2. Na segunda parte, definimos as interfaces e os cabeçalhos públicos. Montamos nossos primeiros headers!
  3. Na terceira-primeira parte 😅, instalamos as IDEs e colocamos todo o necessário para termos os nossos projetos compilando!
 
Agora vamos atacar os testes unitários!

O que vamos precisar?

Para os testes unitários vamos utilizar o Ceedling, que é baseado no Unity. Após tudo ter sido corretamente instalado, o Ceedling opera por linha de comando, então os testes podem ser executados de diversas maneiras diferentes. Eu particularmente gosto de fazer isso usando o Notepad++ e o plugin nppExec, mas fique à vontade para usá-lo na maneira que achar mais conveniente!
 
Hoje vou mostrar como colocar ele para rodar no Windows. Vamos precisar instalar:
  • O Ruby, que é a linguagem de programação no qual Ceedling se baseia.
  • O próprio Ceedling.
  • O MinGW, que nos fornece o gcc, o compilador que vamos usar para compilar os testes.
 
Finalmente, dá uma olhada no nosso repositório, atualizei ele com o conteúdo necessário para os testes unitários! Também criei uma nova tag com os trabalhos de hoje, Inter_Intra_#3.2!
 
Vamos começar?

Instalando o necessário

Vamos começar com o Ruby, que você pode baixar através do Ruby Installer for Windows. Nesta página você encontrará diversas versões diferentes; eu recomendo que você baixe a versão mais recente para a arquitetura da sua máquina. O DevKit não é necessário. 🙂
Página de download do Ruby. Está sublinhado a versão que eu usaria!
Com o Ruby instalado, você ganhará um novo diretório no seu menu iniciar e dentre os seus itens estará disponível executar o prompt de comando com o Ruby:
(sim, meu Ruby está um pouco desatualizado) 😅
Neste prompt, basta chamar o comando ‘gem install ceedling‘ e a instalação do Ceedling é feita automagicamente:
Quando você for instalar pela 1ª vez você terá mais mensagens da operação e será mais demorado!
Finalmente, precisamos instalar o MinGW. Ele é um grande pacote com diversas ferramentas de desenvolvimento, mas para o nosso caso vamos precisar apenas do gcc e do gdb.
 
Entre na seção de downloads e baixe o mingw-get-setup.exe:
Recomendo clicar neste pequeno botão azul no canto inferior esquerdo.
Durante a sua instalação ele vai te perguntar aonde você quer colocar ele. Eu recomendo o diretório padrão que vai ser sugerido, na raiz do seu drive principal. Daqui a pouco vamos colocar este caminho nas suas variáveis de ambiente:
Telas de instalação não seguem padrões, né? 😅
Acabando a instalação o MinGW Installation Manager será aberto. Nos itens da esquerda clique em ‘All packages‘ e depois, nos itens da direita, escolha os itens para o gcc e o gdb:
Selecionando os itens do gcc...
... e os do gdb!
Instale estes itens clicando no menu ‘Installation -> Apply Changes’. Pronto!
 
Para terminar, os executáveis do Ruby e do MinGW precisam estar na sua variável de ambiente Path. Adicione seus caminhos nela:
Variáveis de ambiente sendo revisitadas.
Reinicie a sua máquina e… tudo deve estar pronto! Vamos testar? 👊

Testando os testes unitários

Abra novamente o prompt de comando com o Ruby e navegue até o diretório do seu repositório. Chegando lá, navegue novamente para o diretório ‘tests/examples/wdayToStr/tests/base’. Com o prompt neste diretório, execute o comando ‘ceedling test:all‘ e… voila! Bem vindo ao seu primeiro uso do Ceedling! ✌
Um pequeno passo para seu computador, um grande passo para o seu lado desenvolvedor!

O que foi tudo isso, Andre?

O que aconteceu foi o seguinte:
  • Eu atualizei o nosso repositório, colocando novo conteúdo no diretório ‘tests’
  • Nele temos agora os arquivos do Ceedling e um projeto de exemplo
  • Você rodou os testes deste projeto de exemplo e ali estão os resultados.. nossa, um teste falhou! 😯
Novas pastas no nosso diretório de testes.
Então agora no repositório temos os arquivos do Ceedling. Eu fortemente recomendo fortemente que você leia a literatura disponível nele, na pasta de docs, que está em ‘/tests/ceedling/docs’.
 
Também fiz um pequeno exemplo, com uma função aonde, sendo dado um número inteiro, ela te fala qual dia da semana este número representa, de tal forma que o valor zero é domingo, o valor um é segunda e por aí vai. A sua lógica é bem simplezinha, mas eu intencionalmente deixei um erro no seu código! 😈
 
O exemplo consiste do diretório source, que é o que contém o seu código fonte. Também tem outro diretório, o de tests, aonde ficam os setups de testes unitários. Aqui temos apenas um setup, que chamei de base, mas os módulos podem ter muitos setups diferentes!
 
O Ceedling opera sobre os arquivos ‘project.yml’. Estes arquivos contém todas as informações que eles precisam para ser executados. É por isso que te disse para ir com o prompt de comando até o diretório dos testes e executar o Ceedling lá, ele tem que ser chamado aonde está este arquivo.
 
Finalmente, no diretório dos testes unitários você sempre vai encontrar uma pasta ‘tests’, aonde estarão os testes unitários per si.
/*******************************************************************************
 *  INCLUDES
 ******************************************************************************/
#include "unity.h"
#include "myTestDefs.h"

#include "wdayToStr.h"

/*******************************************************************************
 *  SET UP / TEAR DOWN
 ******************************************************************************/
void setUp(void)
{
}

void tearDown(void)
{
}

/*******************************************************************************
 *  TESTS
 ******************************************************************************/
void test_1stDayIsSunday(void)
{
  TEST_ASSERT_EQUAL_STRING("sunday", wdayToStr(0));
}

void test_2ndDayIsMonday(void)
{
  TEST_ASSERT_EQUAL_STRING("monday", wdayToStr(1));
}

void test_3rdDayIsTuesday(void)
{
  TEST_ASSERT_EQUAL_STRING("tuesday", wdayToStr(2));
}
Te convido para abrir o código fonte sendo testado, os testes unitários e o arquivo de configuração do Ceedling. Tente entender o que eles estão fazendo, veja como que os testes estão chamado o CUT (Code Under Test) e verificando o resultado dele. Tente encontrar qual que é o erro no nosso algoritmo que está fazendo um teste falhar! 🤔
 
Após tudo isso… meus parabéns! Se você chegou até aqui então você está pronto para montar o software embarcado do primeiro produto da sua empresa! 👊

Vamos para 2021?

Está preparado para o ano que vem? 💪
E com isso, pessoal, vou encerrando o nosso expediente este ano!
 
Eu queria terminar agradecendo você, visitante, por ter acompanhado comigo até aqui nesta jornada. Eu espero que você esteja aprendendo bastante e que você tire muito, mas muito proveito deste conteúdo! Te falo que isto tudo está sendo uma aventura muito gostosa para mim e mal posso esperar pelo ano que vem!
 
Com tudo isso, lhe desejo um Feliz Natal e um Super 2021 para você, sua família e seus amigos. O ano de 2020 foi difícil, mas tenho certeza que 2021 será ótimo! Nos vemos lá! 👏

3 comentários em “Inter e Intra #3.2 – Testes Unitários!”

  1. Andre,
    Parabéns pelos conteúdos, são muito dinâmicos e com uma linha de raciocínio incrível!
    No aguardo dos seus próximos posts! Espero vê-los em breve!

  2. Olá André, novamente muito obrigado por todo esse conteúdo de ouro, eu aprendi bastante e está sendo muito útil. Deixo aqui um Feliz Ano Novo pra vc e toda sua família e que 2021 seja um ano muito melhor para todos ! Forte abraço !

Não é possível comentar.