동일한 명령을 여러 번 연속으로 실행하고 모든 종료 코드를 캡처하는 방법은 무엇입니까?

동일한 명령을 여러 번 연속으로 실행하고 모든 종료 코드를 캡처하는 방법은 무엇입니까?

저는 매우 불안정한 엔드투엔드 테스트 스위트를 실행하고 있으며 어떤 테스트가 가장 불안정한지 확인하는 방법을 원합니다. 가장 쉬운 방법은 테스트를 수백 번 실행하고 성공률 값을 반환하는 것 같습니다.

물론 내 문제는 내가 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_$x또는 를 실행하세요 SPEC=desktop/homepage npm test > combined_log. 이를 위해 x스크립트 상단에 선언한 변수를 몰래 빌려서 각 테스트를 증가시켰습니다.

  2. 또한 함수에서는 변수를 정의 하거나 실행할 runTests필요가 없습니다 .exitCodeechoreturn $?

  3. 귀하의 함수에서 함수 외부에서 함수를 호출하므로 runTestsMany변수 는 모든 반복에 대해 항상 동일하기 때문에 BS로 원하는 것과 가까운 스크립트를 호출하겠습니다 .runTestswhileexitcode1..numtotal

  4. 1 또는 0만 있을 수 있다고 가정하므로 exitcode테스트할 필요가 없습니다. 변수에 추가하기만 하면 됩니다 numerror. numError=$(($numError + $exitcode)).

  5. echo개별적인 성공이나 오류를 실행하는 것은 유용한 정보를 추가하지 않고 결과를 복잡하게 만들기 때문에 아무 의미가 없다고 생각합니다 .

  6. 선언된 최종 변수 도 필요하지 않습니다. 그냥 후속 명령문 numsuccess에 넣으면 됩니다 .$(($numTotal - $numError))echo

  7. 성명서는 어떻게 되나요 trap? 분실/삭제하세요.

관련 정보