Em meu local de trabalho, houve um grande ímpeto para que adotássemos totalmente o desenvolvimento orientado a testes. Isso, junto com meu desejo de me familiarizar mais com o shellscript, me inspirou a modificar meu script de teste de unidade para ser, bem, mais útil.
O anterior simplesmente iterou através de uma pasta e executou todos os testes naquela pasta, um por um, algo que o PHPUnit faz por padrão. Isso se tornou um problema quando queríamos renderizar os resultados de cobertura de código porque continuávamos sobrescrevendo os resultados e, portanto, apenas o último resultado ficava visível. Sem utilidade. Executar o PHPUnit enquanto renderiza a cobertura do código (vamos chamá-lo de CC de agora em diante, meus dedos não gostam da repetição desnecessária) foi significativamente mais lento (mesmo nas feras que usamos no trabalho), portanto, um dos requisitos era que o script deveria ser capaz para ser executado sem gerar CC se o usuário não quiser.
Então, para executar minha função para gerar cobertura de código, eu
./rununittests -c html
Caso contrário, para uma corrida normal, eu simplesmente correria
./rununittests
USO
rununittests [-c clover|craph4j|html|php|text] [-d path/to/coverage/output]
-c [coverage type] Create code coverage
-d [destination] The path to save the code coverage
-h This help
-? This help
E o código
## rununittests
# The function to show the help
showHelp () {
echo ""
echo "Usage";
echo "rununittests [-c clover|craph4j|html|php|text] [-d path/to/coverage/output]";
echo "-c [coverage type] Create code coverage";
echo "-d [destination] The path to save the code coverage"
echo "-h This help"
echo "-? This help"
}
# The default destination of the coverage results
dest='temp/unittestresults'
# If option '-c' is passed, the coverage that we will generate
coverage=''
while getopts "c:d:h?" opt; do
case $opt in
c)
coverage="--coverage-$OPTARG"
continue
;;
d)
dest="$OPTARG"
continue
;;
h|?)
showHelp
exit
;;
esac
done
if [ $coverage ];
then
phpunit $coverage $dest --verbose --bootstrap index.php unittests
exit
fi
phpunit --verbose --bootstrap index.php unittests
E uma rápida análise do que eu estava fazendo
showHelp () {
echo ""
echo "Usage";
echo "rununittests [-c clover|craph4j|html|php|text] [-d path/to/coverage/output]";
echo "-c [coverage type] Create code coverage";
echo "-d [destination] The path to save the code coverage"
echo "-h This help"
echo "-? This help"
}
Tudo o que foi feito aqui foi declarar uma função para mostrar o arquivo de ajuda, caso desejemos fazê-lo mais de uma vez.
# The default destination of the coverage results
dest='temp/unittestresults'
# If option '-c' is passed, the coverage that we will generate
coverage=''
Tudo o que fazemos aqui é declarar variáveis que usaremos mais tarde. Observe a ausência de espaço ao redor do sinal de igual.
while getopts "c:d:h?" opt; do
case $opt in
c)
coverage="--coverage-$OPTARG"
continue
;;
d)
dest="$OPTARG"
continue
;;
h|?)
showHelp
exit
;;
esac
done
Esta parte da função é simples , chamada de instrução em script de shell (acredito).switch statement
case esac
while getopts "c:d:h?" opt; do
getopts
é a função que nos permite passar opções para nosso script de shell. Os dois pontos após a letra (por exemplo ) significa que estamos esperando um argumento após a opção, que é armazenado na variável . Isto significa que nossos possíveis opções nesta função são , , e .c:
$OPTARG
-c [argument]
-d [argument]
-h
-?
if [ $coverage ];
then
phpunit $coverage $dest --verbose --bootstrap index.php unittests
exit
fi
phpunit --verbose --bootstrap index.php unittests
A última parte do script é uma instrução if simples, no estilo bash. Observe o espaço ao redor dos colchetes