如何连续多次运行相同的命令并捕获所有退出代码?

如何连续多次运行相同的命令并捕获所有退出代码?

我正在运行一个非常不稳定的端到端测试套件,我想要一种方法来确定哪些测试是最不稳定的。最简单的方法似乎是运行测试数百次并返回成功百分比值。

我的问题当然是我不熟悉 bash。

这就是我所在的地方:

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

它接近我想要的,但它迫使我静默测试的所有输出,这使得运行后对故障的调查变得更加笨拙。

在捕获退出代码时如何仍然从测试中输出?

提前致谢!

最佳迈克尔

编辑:另外,我如何传入分配给的脚本output?每当我尝试将其放入变量中时,我都会得到SPEC=desktop/homepage: No such file or directory,所以我做错了。

答案1

太棒了; 1)输出重定向; 2)不要trap

完整答案:

  1. 在您的函数中runTests,您可以将输出重定向到某些单个或多个日志文件。不必创建局部变量output并且从不使用它,只需运行SPEC=desktop/homepage npm test > uniqe_log_$xSPEC=desktop/homepage npm test > combined_log。为此,我偷偷借用了x您在脚本顶部声明的变量并增加每个测试。

  2. 此外,在您的函数中runTests,无需定义变量exitCode或执行echo;只需执行即可return $?

  3. 我称你的脚本接近你想要的为BS,因为在你的函数中runTestsMany,你runTests在你的函数之外调用函数while,所以变量exitcode对于所有迭代总是相同的1..numtotal

  4. 你假设它exitcode只能是 1 或 0,所以不需要对它进行任何测试,只需将它添加到你的变量中numerror,即。 numError=$(($numError + $exitcode))。

  5. 我不认为执行 individualecho的成功或错误有什么意义,因为它不会添加有用的信息,只会使您的输出变得混乱。

  6. 声明的final变量numsuccess也是不必要的;只需放入$(($numTotal - $numError))后续echo语句即可。

  7. 声明是怎么回事trap?丢失/删除它。

相关内容