Bash 스크립트 테스트 방법(2020 가이드)
8635 단어 codequalitytutorialbashtesting
Bash 스크립팅은 모든 개발자가 작업을 자동화하고 일상적인 활동을 용이하게 하며 수고를 줄이는 데 도움이 되는 가장 편리한 도구 중 하나입니다. 그러나 자동화 도구는 코드와 같은 방식으로 처리되지 않으면 실제로 수고를 증가시킬 수 있습니다. Bash 스크립트는 구식이 되어 작동을 멈추고 유지 관리가 어려워지고 기술 부채가 증가할 수 있습니다. 버전 관리에서 확인하고 테스트를 작성하고 CI를 사용해야 합니다.
이 기사에서는 Bash용 테스트를 작성하는 자동화 스크립트의 품질을 개선하는 방법을 살펴보겠습니다.
바흐
Bach는 Bash 스크립트에 대한 단위 테스트를 작성할 수 있는 가능성을 제공하는 Bash용 테스트 프레임워크입니다. Bach는 PATH에 있는 모든 명령을 테스트된 Bash 스크립트의 외부 종속성으로 만들어 어떤 명령도 실제로 실행되지 않지만 "드라이 런"으로 실행됩니다. 이런 식으로 명령 자체가 아니라 스크립트의 논리를 테스트할 수 있습니다. Bach는 기본적으로 모든 명령을 모의하고 필요한 경우 실제 명령을 실행하기 위한 API 세트를 제공합니다.
바흐를 설치하는 방법
전제 조건
Bash v4.3+
Coreutils (GNU/리눅스)
Diffutils (GNU/리눅스)
Bach Testing Framework 다운로드bach.sh를 프로젝트에 설치하려면
source
명령어를 사용하여 가져옵니다bach.sh
.예를 들어:
source path/to/bach.sh
할 수 있는 일
Bach에서는 Bash 스크립트가 실제로 실행할 내용을 테스트할 수 있습니다.
Bach의 모든 테스트 케이스는 두 가지 기능으로 구성됩니다. 하나는 테스트 실행용이고 다른 하나는 어설션용입니다.
테스트를 실행할 때 Bach는 두 기능을 별도로 실행하고 두 기능에서 실행되는 명령 순서를 비교합니다. 모든 테스트 기능은 이름 test-로 시작해야 하며, 주장 기능은 -assert로 끝나야 합니다.
테스트 케이스를 작성하는 방법
테스트 케이스를 작성하는 방법에 대한 몇 가지 실용적인 예를 살펴보겠습니다.
#!/usr/bin/env bash
set -euo pipefail
source bach.sh
Bach 테스팅 프레임워크를 활성화하기 위해 가장 먼저 할 일은 bash.sh를 소싱하는 것입니다.
test-rm-your-dot-git() {
@mock find ~ -type d -name .git === @stdout ~/src/your-awesome-project/.git \
~/src/code/.git
find ~ -type d -name .git | xargs -- rm -rf
}
test-rm-your-dot-git-assert() {
rm -rf ~/src/your-awesome-project/.git ~/src/code/.git
}
우리가 테스트하는 첫 번째 스크립트는 모든 .git 폴더를 찾아 제거하는 명령입니다. 두 개의 디렉토리를 출력하기 위해 해당 매개변수로
find
명령을 조롱하여 테스트할 수 있습니다.test-mock-script-with-custom-complex-action() {
@mock ./path/to/script <<\SCRIPT
if [[ "$1" == foo ]]; then
@echo bar
else
@echo anything
fi
SCRIPT
./path/to/script foo
./path/to/script something
}
test-mock-script-with-custom-complex-action-assert() {
bar
anything
}
두 번째 스크립트에서는 Bach를 사용하여 입력에 따라 다른 출력을 반환하는 스크립트를 테스트합니다. 이 경우
@mock ./path/to/script
를 사용하여 스크립트를 조롱한 다음 스크립트 동작을 정의합니다.test-bach-framework-mock-commands() {
@mock find . -name fn === @stdout file1 file2
ls $(find . -name fn)
@mock ls file1 file2 === @stdout file2 file1
ls $(find . -name fn) | xargs -n1 -- do-something
@mock ls === @stdout foo bar foobar
ls | xargs -n2 -- bash -c 'do-something ${@}' -s
}
test-bach-framework-mock-commands-assert() {
ls file1 file2
do-something file2
do-something file1
bash -c 'do-something ${@}' -s foo bar
bash -c 'do-something ${@}' -s foobar
}
이 스크립트에서 명령을 조롱하고
$(...)
표현식으로 실행하고 파이프를 사용하는 것과 같은 몇 가지 복잡한 작업을 수행하는 방법을 볼 수 있습니다.test-bach-framework-set--e-should-work() {
set -e
do-this
builtin false
should-not-do-this
}
test-bach-framework-set--e-should-work-assert() {
do-this
@fail
}
여기서 우리는
set -e
의 동작을 테스트하므로 builtin false
로 스크립트가 실패하도록 하고 @fail
를 사용하여 실패를 테스트합니다.test-no-double-quote-star() {
@touch bar1 bar2 bar3 "bar*"
function cleanup() {
rm -rf $1
}
# We want to remove the file "bar*", not the others
cleanup "bar*"
}
test-no-double-quote-star-assert() {
# Without double quotes, all bar files are removed!
rm -rf "bar*" bar1 bar2 bar3
}
test-double-quote-star() {
@touch bar1 bar2 bar3 "bar*"
function cleanup() {
rm -rf "$1"
}
# We want to remove the file "bar*", not the others
cleanup "bar*"
}
test-double-quote-star-assert() {
# Yes, with double quotes, only the file "bar*" is removed
rm -rf "bar*"
}
여기에서 인수를 가져와 제거하는
function
를 정의합니다. 첫 번째 예에서는 함수에서 큰따옴표를 사용하지 않습니다. 이렇게 하면 bar-로 시작하는 모든 파일이 제거됩니다. 두 번째 예에서 함수는 큰따옴표를 사용하므로 bar*라는 파일만 제거됩니다.Bach 테스트를 실행하는 방법
파일에
.sh
를 추가하는 것을 기억하면서 모든 테스트 사례를 단일source bach.sh
파일에 작성할 수 있습니다. 이 시점에서 테스트를 실행하려면 .sh
파일을 실행하기만 하면 됩니다.이거 야!
이 게시물에서는 자동화의 품질과 안정성을 개선하기 위해 Bash 스크립트에 대한 단위 테스트를 작성하는 방법을 살펴보았습니다.
Twitter에서 저에게 연락하여 귀하의 생각을 알려주세요!
이 기사는 원래 my blog에 게시되었습니다. 이 게시물이 마음에 드셨다면 다른 분들도 읽어보세요!
Reference
이 문제에 관하여(Bash 스크립트 테스트 방법(2020 가이드)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gasparev/how-to-test-bash-scripts-2020-guide-lh1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)