Como posso executar o mesmo comando várias vezes em série e capturar todos os códigos de saída?

0

Estou executando uma suíte de testes de ponta a ponta que é bastante simples, e gostaria de uma maneira de determinar quais testes são mais difíceis. A abordagem mais fácil parece ser executar testes 100 vezes e retornar um valor percentual de sucesso.

O meu problema, claro, é que eu não sou bem versado em bash.

Aqui é onde eu estou:

numTotal=2
numError=0
x=1

function runTests() {
  local output=$(SPEC=desktop/homepage npm test)
  local exitCode=$?
  echo "$exitCode"
}

function runTestsMany() {
  while [ $x -le $numTotal ]
  do
    local exitCode=$(runTests)
    if [ 1 -eq "$exitCode" ]
    then
      numError=$(( $numError + 1 ))
      echo "Error"
    else
      echo "Success"
    fi
    x=$(( $x + 1 ))
  done
  numSuccess=$(($numTotal - $numError))
  echo "$numSuccess / $numTotal succeeded."
}

trap runTestsMany EXIT

É perto do que eu quero, mas me obrigou a silenciar todos os resultados dos testes, o que torna as investigações posteriores de falhas muito mais complicadas.

Como posso ainda produzir a partir dos testes durante a captura de códigos de saída?

Obrigado antecipadamente!

Melhor Michael

Edit: Além disso, como posso passar o script atribuído a output ? Sempre que eu tento colocá-lo dentro de uma variável, recebo SPEC=desktop/homepage: No such file or directory , então estou fazendo algo errado.

    
por M. Herold 06.03.2018 / 00:26

1 resposta

1

tldr; 1) redirecionamento de saída; 2) não trap .

Resposta completa:

  1. Na sua função runTests , você pode redirecionar a saída para alguns arquivos de log únicos ou múltiplos. Em vez de criar uma variável local output e nunca usá-la, basta executar SPEC=desktop/homepage npm test > uniqe_log_$x ou SPEC=desktop/homepage npm test > combined_log . Para isso, eu emprestado sorrateiramente a variável x que você declarou no topo do seu script e incrementar cada teste.

  2. Também na sua função runTests , não é necessário definir uma variável exitCode ou executar echo ; simplesmente execute return $? .

  3. Eu chamo BS na sua afirmação de que seu script está próximo do que você quer, porque na sua função runTestsMany , você chama a função runTests fora do seu while , então variável exitcode será sempre ser o mesmo para todas as iterações 1..numtotal .

  4. Você presume que exitcode só pode ser 1 ou 0, portanto não há necessidade de realizar nenhum teste, basta adicioná-lo à variável numerror , ou seja. numError = $ (($ numError + $ exitcode)).

  5. Eu não vejo o ponto de executar o indivíduo echo s para sucesso ou erro, pois ele não adiciona informações úteis e apenas sobrecarregará sua saída.

  6. A variável final declarada, numsuccess também é desnecessária; basta colocar $(($numTotal - $numError)) na instrução echo subsequente.

  7. Qual é a declaração trap ? Perdê-lo / removê-lo.

por 06.03.2018 / 01:00