|
| 1 | +.TH SHELLUNITY-DEV "17 ABR 2022" "Versão 0.1.0" "SHELLUNITY-DEV Manual de uso" |
| 2 | + |
| 3 | +.SH NOME |
| 4 | +shellunity-dev - Documentação do desenvolvedor |
| 5 | + |
| 6 | +.SH VARIÁVEIS GLOBAIS |
| 7 | +A biblioteca shellunity utiliza as seguintes variáveis globais: |
| 8 | + |
| 9 | +.BR NUMBER_OF_TESTS_UNITY, |
| 10 | +armazena o número total de testes realizados. |
| 11 | + |
| 12 | +.BR NUMBER_OF_FAILURES_UNITY, |
| 13 | +armazena o número total de testes que falharam. |
| 14 | + |
| 15 | +.BR NUMBER_OF_IGNORED_UNITY, |
| 16 | +armazena o número total de testes ignorados |
| 17 | + |
| 18 | +.BR FINISHED_ALL_TESTS_UNITY, |
| 19 | +variável de controle para indicar se os testes foram finalizados. Seu valor é igual a zero se ainda faltar testes para realizar. |
| 20 | + |
| 21 | +.BR TEST_IGNORE_UNITY, |
| 22 | +configura a função TEST_UNITY para ignorar todos os testes se estiver definida como 1, ou para realizar todos os testes se estiver definida como 0. |
| 23 | + |
| 24 | + |
| 25 | +.SH PRINCIPAIS FUNÇÕES |
| 26 | + |
| 27 | +.BR TEST_UNITY |
| 28 | + |
| 29 | +Esta é a principal função da biblioteca shellunity e que manipula as variáveis globais com os contadores dos testes realizados, que falharam e os ignorados. A cada chamada a esta função, o número total de testes em $NUMBER_OF_TESTS_UNITY é incrementado uma unidade. Se a variável $TEST_IGNORE_UNITY estiver configurada igual a 1, o teste é ignorado e a função incrementa o número de testes ignorados em $NUMBER_OF_IGNORED_UNITY e retorna. Esta lógica é implementada nas linhas a seguir: |
| 30 | + |
| 31 | + NUMBER_OF_TESTS_UNITY=$((NUMBER_OF_TESTS_UNITY+1)) |
| 32 | + |
| 33 | + [ "$TEST_IGNORE_UNITY" == "1" ] && { |
| 34 | + |
| 35 | + NUMBER_OF_IGNORED_UNITY=$((NUMBER_OF_IGNORED_UNITY+1)) |
| 36 | + |
| 37 | + echo -e "$0:$2:$3:\033[43mIGNORED\033[m" |
| 38 | + |
| 39 | + return |
| 40 | + |
| 41 | + } |
| 42 | + |
| 43 | +O resultado esperado deste trecho é como no exemplo a seguir: |
| 44 | + |
| 45 | + ./test_example.sh:38:TEST_PASS:IGNORED |
| 46 | + |
| 47 | +O restante do código da função TEST_UNITY está condicionado pela variável TEST_IGNORE_UNITY ser igual a 0, pois caso contrário a função irá retornar na condicional apresentada acima. O restante da função está condicionado pela variável FINISHED_ALL_TESTS_UNITY que é igual a 0 se todos os testes da suíte de testes ainda não foram realizados. Assim, a função exibe o nome do programa principal da suíte de testes, o número da linha onde o teste foi chamado e o tipo de teste armazenados em $0, $2 e $3, respectivamente, como a seguir: |
| 48 | + |
| 49 | + if [ "$FINISHED_ALL_TESTS_UNITY" == "0" ] |
| 50 | + |
| 51 | + then |
| 52 | + |
| 53 | + echo -n "$0:$2:$3:" |
| 54 | + |
| 55 | + fi |
| 56 | + |
| 57 | +O resultado esperado deste trecho de código é o seguinte: |
| 58 | + |
| 59 | + ./test_example.sh:49:TEST_ASSERT_EQUAL_STRING: |
| 60 | + |
| 61 | + ./test_example.sh:33:TEST_ASSERT_EQUAL_STRING: |
| 62 | + |
| 63 | +Por fim, a função exibe PASS ou FAIL após as informações exibidas acima, indicando se o teste passou ou não, a depender da variável $1 passada à função TEST_UNITY. Se $1 foi passada com um valor diferente de zero, oque indica que o teste falhou, TEST_UNITY incrementa o valor da variável global $NUMBER_OF_FAILURES_UNITY em uma unidade antes de exibir FAIL na tela do terminal. |
| 64 | + |
| 65 | + if [ "$1" == "0" ] |
| 66 | + |
| 67 | + then |
| 68 | + |
| 69 | + echo -e "\033[42mPASS\033[m" |
| 70 | + |
| 71 | + else |
| 72 | + |
| 73 | + NUMBER_OF_FAILURES_UNITY=$((NUMBER_OF_FAILURES_UNITY+1)) |
| 74 | + |
| 75 | + echo -e "\033[41mFAIL\033[m" |
| 76 | + |
| 77 | + fi |
| 78 | + |
| 79 | +O resultado completo é apresentado a seguir: |
| 80 | + |
| 81 | + ./test_example.sh:49:TEST_ASSERT_EQUAL_STRING:FAIL |
| 82 | + |
| 83 | + ./test_example.sh:33:TEST_ASSERT_EQUAL_STRING:PASS |
| 84 | + |
| 85 | +.BR RESULT_UNITY |
| 86 | + |
| 87 | +Esta função é chamada ao final da execução da suíte de testes, como estabelecido utilizando o comando trap a seguir: |
| 88 | + |
| 89 | + trap RESULT_UNITY exit |
| 90 | + |
| 91 | +O objetivo da função RESULT_UNITY é exibir a contagem final dos casos de testes, apresentando o total dos testes realizados, os testes que falharam (se houver falha em algum teste) e o número de testes ignorados. Para tanto, a função utiliza os valores armazenados nas variáveis globais $NUMBER_OF_TESTS_UNITY, $NUMBER_OF_FAILURES_UNITY, e $NUMBER_OF_IGNORED_UNITY. O resultado esperado a seguir: |
| 92 | + |
| 93 | + ----------------------- |
| 94 | + |
| 95 | + 16 Tests 7 Failures 2 Ignored |
| 96 | + |
| 97 | + FAIL |
| 98 | + |
| 99 | +As duas últimas linhas da função RESULT_UNITY, apresentadas a seguir, servem para verificar se todos os testes passaram ou se algum teste falhou, fazer a chamada à função TEST_UNITY para imprimir FAIL ou SUCCES na tela e encerrar com o status de execução 0 ou 1, respectivamente. Basta que um dos testes falhe para o status de execução retornado ser 1. |
| 100 | + |
| 101 | + [ "$NUMBER_OF_FAILURES_UNITY" -eq "0" ] && TEST_UNITY 0 && exit 0 |
| 102 | + |
| 103 | + TEST_UNITY 1 && exit 1 |
| 104 | + |
| 105 | + |
| 106 | +.SH ASSERÇÕES BÁSICAS |
| 107 | +.BR TEST_IGNORE |
| 108 | + |
| 109 | +A função TEST_IGNORE é utilizada para ignorar um bloco de testes. Esta funciona por meio de uma chave "on/off" recebida através do parâmetro $1 que altera a variável global TEST_IGNORE_UNITY. Quando a variável TEST_IGNORE_UNITY é igual a 1 os testes são ignorados pela função principal TEST_UNITY, quando esta variável é igual a 0 os testes são realizados e considerados pela função TEST_UNITY. A utilização da função TEST_IGNORE ocorre como no exemplo de uso a seguir: |
| 110 | + |
| 111 | + TEST_IGNORE on # Ligar a chave para ignorar testes |
| 112 | + |
| 113 | + TEST_ASSERT_TRUE "2==2" #... testes ignorado |
| 114 | + |
| 115 | + TEST_ASSERT_FALSE "2==3" #... teste ignorado |
| 116 | + |
| 117 | + TEST_ASSERT_FALSE "3==3" #... teste ignorado |
| 118 | + |
| 119 | + TEST_IGNORE off # Desligar a chave para ignorar testes |
| 120 | + |
| 121 | + # Os testes a seguir serão realizados |
| 122 | + |
| 123 | + TEST_ASSERT_TRUE "2==2" #... testes realizado |
| 124 | + |
| 125 | + TEST_ASSERT_FALSE "3==3" #... teste realizado |
| 126 | + |
| 127 | +Esta manipulação da variável global TEST_IGNORE_UNITY ocorre dentro de um bloco if simples a depender do parâmetro $1 passado a função TEST_IGNORE_UNITY. |
| 128 | + |
| 129 | + TEST_IGNORE(){ |
| 130 | + |
| 131 | + if [ "$1" == "on" ] |
| 132 | + |
| 133 | + then |
| 134 | + |
| 135 | + TEST_IGNORE_UNITY="1" |
| 136 | + |
| 137 | + elif [ "$1" == "off" ] |
| 138 | + |
| 139 | + then |
| 140 | + |
| 141 | + TEST_IGNORE_UNITY="0" |
| 142 | + |
| 143 | + fi |
| 144 | + |
| 145 | + } |
| 146 | + |
| 147 | +.BR TEST_MESSAGE |
| 148 | + |
| 149 | +Esta função exibe uma mensagem na tela do terminal durante os testes. Basta chamar a função e passar a mensagem a ser exibida. Como não há chamada à função TEST_UNITY, nenhum teste é contabilizado quando esta função é chamada. A saída esperada segue abaixo: |
| 150 | + |
| 151 | + ./test_example.sh:24:INFO: Mensagem qualquer |
| 152 | + |
| 153 | +.BR TEST_FAIL |
| 154 | + |
| 155 | +Esta função faz o teste falhar quando chamada. Para tanto, ela chama TEST_UNITY internamente passando o status 1 (teste falhou) como variável $1. A função TEST_FAIL a seguir: |
| 156 | + |
| 157 | + TEST_FAIL(){ |
| 158 | + |
| 159 | + TEST_UNITY 1 "$BASH_LINENO" "$FUNCNAME" |
| 160 | + |
| 161 | + } |
| 162 | + |
| 163 | +.BR TEST_FAIL_MESSAGE |
| 164 | + |
| 165 | +Esta função faz o teste falhar semelhante a função TEST_FAIL, mas antes exibe uma mensagem de falha passada pelo usuário. |
| 166 | + |
| 167 | +.BR TEST_PASS |
| 168 | + |
| 169 | +Esta função faz o teste passar quando chamada. Para tanto, ela chama TEST_UNITY internamente passando o status 0 (teste passou) como variável $1. A função TEST_PASS a seguir: |
| 170 | + |
| 171 | + TEST_PASS(){ |
| 172 | + |
| 173 | + TEST_UNITY 0 "$BASH_LINENO" "$FUNCNAME" |
| 174 | + |
| 175 | + } |
| 176 | + |
| 177 | +.BR TEST_PASS_MESSAGE |
| 178 | + |
| 179 | +Esta função faz o teste passar semelhante a função TEST_PASS, mas antes exibe uma mensagem passada pelo usuário. |
| 180 | + |
| 181 | +.SH ASSERÇÕES |
| 182 | + |
| 183 | +.BR TEST_ASSERT_EQUAL |
| 184 | + |
| 185 | +Esta função serve para verificar igualdade entre dois números recebidos através de $1 e $2. Internamente, esta comparação é realizada com a calculadora bc e retornada para a variável $CONDITION como 1 se os números são iguais e 0 se são diferentes. Daí basta chamar a função TEST_UNITY com o status de execução 0 se $CONDITION é 1 e 1 se $CONDITION é 0. |
| 186 | + |
| 187 | +.BR TEST_ASSERT_NOT_EQUAL |
| 188 | + |
| 189 | +Esta função serve para verificar desigualdade entre dois números recebidos através de $1 e $2. Esta função funciona da mesma forma que a função TEST_ASSERT_EQUAL, porém a condição de verificação é a diferença '!=' e não a igualdade '==' entre os dois números passados. Daí basta chamar a função TEST_UNITY com o status de execução 0 se $CONDITION é 1 (Os números são diferentes) e 1 se $CONDITION é 0 (os números são iguais). |
| 190 | + |
| 191 | +.BR TEST_ASSERT_TRUE |
| 192 | + |
| 193 | +Esta função funciona de modo semelhante a TEST_ASSERT_EQUAL, porém a condicional é passada diretamente através de $1. |
| 194 | + |
| 195 | +.BR TEST_ASSERT_FALSE |
| 196 | + |
| 197 | +Esta função funciona de modo semelhante a TEST_ASSERT_NOT_EQUAL, porém a condicional é passada diretamente através de $1. |
| 198 | + |
| 199 | +.BR TEST_ASSERT_EQUAL_STRING |
| 200 | + |
| 201 | +A verificação de strings é trivial em shell, basta utilizar a seguinte condicional: |
| 202 | + |
| 203 | + [ "$1" == "$2" ] |
| 204 | + |
| 205 | +E daí retornar o status para a função TEST_UNITY, 0 se forem iguais e 1 se forem diferentes. |
| 206 | + |
| 207 | +.SH ASSERÇÕES PARA ARQUIVOS E DIRETÓRIOS |
| 208 | + |
| 209 | +.BR TEST_FILE_FIND |
| 210 | + |
| 211 | +Verifica se o arquivo existe utilizando a seguinte condicional: |
| 212 | + |
| 213 | + [ -f "$1" ] |
| 214 | + |
| 215 | +E daí retorna o status para a função TEST_UNITY, 0 se o arquivo existir e 1 se o arquivo não existir. |
| 216 | + |
| 217 | +.BR TEST_DIR_FIND |
| 218 | + |
| 219 | +Esta asserção verifica se o diretório existe utilizando a seguinte condicional do shell: |
| 220 | + |
| 221 | + [ -d "$1" ] |
| 222 | + |
| 223 | +E daí retorna o status para a função TEST_UNITY, 0 se o diretório existir e 1 se o diretório não existir. |
| 224 | + |
| 225 | +.BR TEST_FILE_X |
| 226 | + |
| 227 | +Esta asserção serve para verificar se o arquivo possui permissão de execução a partir da seguinte condicional do shell: |
| 228 | + |
| 229 | + [ -x "$1" ] |
| 230 | + |
| 231 | +E daí retorna o status para a função TEST_UNITY, 0 se o arquivo tiver permissão de execução e 1 se o arquivo não tiver permissão de execução. |
| 232 | + |
| 233 | +.BR TEST_FILE_W |
| 234 | + |
| 235 | +Esta asserção serve para verificar se o arquivo possui permissão de escrita a partir da seguinte condicional do shell: |
| 236 | + |
| 237 | + [ -w "$1" ] |
| 238 | + |
| 239 | +E daí retorna o status para a função TEST_UNITY, 0 se o arquivo tiver permissão de escrita e 1 se o arquivo não tiver permissão de escrita. |
| 240 | + |
| 241 | +.BR TEST_FILE_R |
| 242 | + |
| 243 | +Esta asserção serve para verificar se o arquivo possui permissão de leitura a partir da seguinte condicional do shell: |
| 244 | + |
| 245 | + [ -r "$1" ] |
| 246 | + |
| 247 | +E daí retorna o status para a função TEST_UNITY, 0 se o arquivo tiver permissão de leitura e 1 se o arquivo não tiver permissão de leitura. |
| 248 | + |
| 249 | +.BR TEST_ISATTY |
| 250 | + |
| 251 | +Esta asserção verifica se a stream de dados passada é um terminal a partir da seguinte condicional do shell: |
| 252 | + |
| 253 | + [ -t "$1" ] |
| 254 | + |
| 255 | +E daí retorna o status para a função TEST_UNITY, 0 se a stream de dados for um terminal e 1 se a stream de dados não for um terminal. |
| 256 | + |
| 257 | +.BR TEST_FILE_NEWER |
| 258 | + |
| 259 | +Esta asserção verifica se o primeiro arquivo $1 é mais novo que o segundo arquivo $2 utilizando a seguinte condicional do shell: |
| 260 | + |
| 261 | + [ "$1" -nt "$2" ] |
| 262 | + |
| 263 | +E daí retorna o status para a função TEST_UNITY, 0 se o primeiro arquivo for mais novo que o segundo e 1 se o primeiro arquivo não for mais novo que o segundo. |
| 264 | + |
| 265 | +.BR TEST_FILE_OLDER |
| 266 | + |
| 267 | +Esta asserção verifica se o primeiro arquivo $1 é mais velho que o segundo arquivo $2 utilizando a seguinte condicional do shell: |
| 268 | + |
| 269 | + [ "$1" -ot "$2" ] |
| 270 | + |
| 271 | +E daí retorna o status para a função TEST_UNITY, 0 se o primeiro arquivo for mais velho que o segundo e 1 se o primeiro arquivo não for mais velho que o segundo. |
| 272 | + |
| 273 | +.BR TEST_FILE_EQUAL |
| 274 | + |
| 275 | +Esta asserção verifica se o primeiro arquivo $1 é o mesmo arquivo $2 passado utilizando a seguinte condicional do shell (útil para verificar se $2 é um hardlink para $1 e vice-versa): |
| 276 | + |
| 277 | + [ "$1" -ef "$2" ] |
| 278 | + |
| 279 | +E daí retorna o status para a função TEST_UNITY, 0 se o primeiro arquivo $1 for o mesmo arquivo em $2 e 1 se o primeiro arquivo $1 não for o mesmo arquivo em $2. |
| 280 | + |
| 281 | +.BR TEST_FILE_EMPTY |
| 282 | + |
| 283 | +Esta asserção verifica se o arquivo passado está vazio utilizando a seguinte condicional do shell: |
| 284 | + |
| 285 | + [ ! -s "$1" ] |
| 286 | + |
| 287 | +E daí retorna o status para a função TEST_UNITY, 0 se o arquivo está vazio e 1 se o arquivo não está vazio. |
| 288 | + |
| 289 | +.SH SUGESTÕES E 'BUG REPORTS' |
| 290 | +Qualquer bug encontrado deve ser reportado para o repositório do Github da Biblioteca ShellUnity na aba 'issues' em: |
| 291 | + |
| 292 | + https://github.com/Dirack/ShellUnity/issues |
| 293 | + |
| 294 | +E deve-se notificar por email o responsável pela manutenção do código: |
| 295 | + |
| 296 | + rodolfo_profissional@hotmail.com (Rodolfo Dirack). |
| 297 | + |
| 298 | +Quando reportar um bug é importante explicitar em que situação este foi produzido |
| 299 | +para que possa ser reproduzido pelo autor, a versão do programa e toda informação |
| 300 | +relevante será bem vinda. |
| 301 | + |
| 302 | +.SH AUTORES |
| 303 | +Rodolfo A. C. Neves (Dirack), e o Grupo de Programação Aplicada à Geofísica (GPGEOF). |
| 304 | + |
| 305 | +Contato: |
| 306 | + |
| 307 | +-Página no github (Dirack) https://github.com/Dirack |
| 308 | + |
| 309 | +-Página no github (GPGEOF) https://github.com/gpgeof. |
| 310 | + |
| 311 | +.SH VEJA TAMBÉM |
| 312 | +.BR shellunity(1), |
| 313 | +.BR shellunity-user(1) |
| 314 | + |
| 315 | +Visite o nosso canal de divulgação científica no Youtube (Geofisicando) em: |
| 316 | + |
| 317 | + https://www.youtube.com/channel/UCi5XD5PCQtPrIRD0H_GJvag |
0 commit comments