Script Shell para executar testes PHPUnit com ou sem cobertura de código

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 statementcase 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