[bash] 단위 테스트 bash 스크립트

Java 코드 외에 실행되는 일부 bash 스크립트가있는 시스템이 있습니다. 우리는 깨질 수있는 모든 것을 테스트하려고하고 있고 그 bash 스크립트가 깨질 수 있기 때문에 우리는 그것들을 테스트하고 싶습니다.

문제는 bash 스크립트를 테스트하기가 어렵다는 것입니다.

bash 스크립트를 테스트하는 방법이나 모범 사례가 있습니까? 아니면 bash 스크립트 사용을 중단하고 테스트 가능한 대체 솔루션을 찾아야합니까?



답변

실제로 Bourne 기반 셸 스크립트를위한 xUnit 기반 단위 테스트 프레임 워크 인 shunit2 가 있습니다 . 나는 그것을 직접 사용하지 않았지만 확인해 볼 가치가있을 것입니다.

유사한 질문이 이전에 제기되었습니다.


답변

토론 그룹에서 다음 답변을 받았습니다.

외부 파일에서 프로 시저 (함수, 이름이 무엇이든)를 가져 오는 것이 가능합니다. 이것이 테스트 스크립트 작성의 핵심입니다. 스크립트를 독립적 인 절차로 분할 한 다음 실행중인 스크립트와 테스트 스크립트로 가져올 수있는 다음 실행 스크립트를 가능한 한 간단하게 만듭니다.

이 방법은 스크립트에 대한 종속성 주입과 같으며 합리적으로 들립니다. bash 스크립트를 피하고 더 테스트 가능하고 덜 모호한 언어를 사용하는 것이 좋습니다.


답변

TAP 호환 Bash 테스트 : Bash 자동 테스트 시스템

Test Anything Protocol 인 TAP는 테스트 장치의 테스트 모듈 간의 간단한 텍스트 기반 인터페이스입니다. TAP는 Perl 용 테스트 도구의 일부로 시작되었지만 이제는 C, C ++, Python, PHP, Perl, Java, JavaScript 등으로 구현되었습니다.


답변

Nikita Sobolev는 몇 가지 다른 bash 테스트 프레임 워크를 비교하는 훌륭한 블로그 게시물을 작성했습니다. Bash 애플리케이션 테스트

참을성이없는 분들께 : Nikita의 결론은 Bats 를 사용하는 것이었지만 Nikita는 2013 년부터 원래 Bats 프로젝트가 적극적으로 유지되지 않았기 때문에 앞으로 나에게 사용할 것으로 보이는 Bats-core 프로젝트를 놓친 것으로 보입니다.


답변

Epoxy 는 주로 다른 소프트웨어를 테스트하기 위해 디자인 한 Bash 테스트 프레임 워크이지만, 자체Carton을 포함하여 bash 모듈도 테스트하는 데 사용합니다 .

주요 이점은 상대적으로 낮은 코딩 오버 헤드, 무제한 주장 중첩 및 검증 할 주장의 유연한 선택입니다.

Red Hat의 일부에서 사용하는 프레임 워크 인 BeakerLib와 비교 하여 프레젠테이션을 만들었습니다 .


답변

bash 스크립트를 테스트하는 것이 “어려웠다”는 이유는 무엇입니까?

다음과 같은 테스트 래퍼의 문제점 :

 #!/bin/bash
 set -e
 errors=0
 results=$($script_under_test $args<<ENDTSTDATA
 # inputs
 # go
 # here
 #
 ENDTSTDATA
 )
 [ "$?" -ne 0 ] || {
     echo "Test returned error code $?" 2>&1
     let errors+=1
     }

 echo "$results" | grep -q $expected1 || {
      echo "Test Failed.  Expected $expected1"
      let errors+=1
 }
 # and so on, et cetera, ad infinitum, ad nauseum
 [ "$errors" -gt 0 ] && {
      echo "There were $errors errors found"
      exit 1
 }


답변

사용하기 쉽고 유용한 도구를 원했기 때문에 shellspec을 만들었습니다 .

순수한 POSIX 쉘 스크립트로 작성되었습니다. shunit2보다 많은 쉘로 테스트했습니다. 그것은 박쥐 / 박쥐 코어보다 강력한 기능을 가지고 있습니다.

예를 들어, 중첩 된 블록 지원, 모의 / 스텁 용이, 건너 뛰기 / 보류 용이, 매개 변수화 된 테스트, 어설 션 라인 번호, 라인 번호 별 실행, 병렬 실행, 임의 실행, TAP / JUnit 포맷터, 커버리지 및 CI 통합, 프로파일 러 등 .

프로젝트 페이지에서 데모를 참조하십시오.