Vou falar com o meu departamento na próxima semana sobre testes de unidade e desenvolvimento orientado a testes. Como parte disso, vou mostrar alguns exemplos do mundo real de algum código que escrevi recentemente, mas também gostaria de mostrar alguns exemplos muito simples que vou escrever na palestra.
Eu tenho pesquisado na web por bons exemplos, mas tenho lutado para encontrar algum que seja particularmente aplicável à nossa área de desenvolvimento. Quase todo o software que escrevemos são sistemas de controle profundamente embutidos, rodando em pequenos microcontroladores. Há muito código C que é facilmente aplicável ao teste de unidade (falarei sobre o teste de unidade no PC, e não no próprio alvo), desde que você fique longe da camada 'inferior': o que fala diretamente aos periféricos do microcontrolador. No entanto, muitos exemplos que encontrei tendem a se basear no processamento de strings (por exemplo, o excelente exemplo de numeração romana Dive Into Python) e, como quase nunca usamos strings, isso não é realmente adequado (sobre as únicas funções de biblioteca que nosso código normalmente usa são memcpy
, memcmp
e memset
,strcat
ou expressões regulares não estão certas).
Então, sobre a questão: alguém pode oferecer bons exemplos de funções que eu possa usar para demonstrar o teste de unidade em uma sessão ao vivo? Uma boa resposta na minha opinião (sujeita a alterações) provavelmente seria:
- Uma função que é simples o suficiente para que qualquer pessoa (mesmo aqueles que escrevem código ocasionalmente) possa entender;
- Uma função que não parece inútil (ou seja, calcular a paridade ou CRC é provavelmente melhor do que uma função que multiplica dois números e adiciona uma constante aleatória);
- Uma função que é curta o suficiente para escrever na frente de uma sala de pessoas (eu posso tirar proveito das muitas pranchetas do Vim para reduzir erros ...);
- Uma função que aceita números, matrizes, ponteiros ou estruturas como parâmetros e retorna algo semelhante, em vez de manipular strings;
- Uma função que possui um erro simples (por exemplo, em
>
vez de>=
) que é fácil de inserir e que ainda funcionaria na maioria dos casos, mas que rompe com um caso particular: fácil de identificar e corrigir com um teste de unidade.
Alguma ideia?
Embora provavelmente não seja relevante, os próprios testes provavelmente serão escritos em C ++ usando o Google Test Framework: todos os nossos cabeçalhos já possuem o #ifdef __cplusplus extern "C" {
wrapper; isso funcionou bem com os testes que fiz até agora.
Respostas:
Aqui está uma função simples que deve gerar uma soma de verificação sobre bytes len .
Ele tem um bug de cerca: na declaração for, o teste deve ser
i < len
.O engraçado é que, se você aplicá-lo a uma sequência de texto como esta ...
você receberá a "resposta certa"! Isso ocorre porque o byte extra que foi soma de verificação foi o terminador de seqüência zero. Portanto, você pode colocar essa função de soma de verificação em código e talvez até enviá-la, e nunca perceber um problema - ou seja, até começar a aplicá-la a algo diferente de cadeias de texto.
Aqui está um teste de unidade simples que sinalizará esse bug (na maioria das vezes ... :-)
fonte
Que tal implementar uma função de classificação como a classificação por bolhas ? Depois que a função de classificação estiver funcionando, você poderá continuar com a pesquisa binária, que é igualmente boa para introduzir testes de unidade e TDD.
A classificação e a pesquisa dependem de comparações que são fáceis de errar. Também envolve a troca de indicadores em torno dos quais deve ser feito com cuidado. Ambos são propensos a erros, então fique à vontade para estragar :)
Mais algumas idéias:
qsort
, e os testes ainda deverão passar, provando que sua nova função de classificação também funciona.fonte