Exercism에서 Bash 연습 문제를 테스트하는 방법을 배워요
Exercism 웹사이트의 온라인 에디터를 사용해서 연습 문제를 풀 수 있어요. 또는 연습 문제를 컴퓨터로 내려받아 로컬에서 푼 다음, Exercism에 제출해도 돼요. 이 문서의 나머지 부분에서는 로컬에서 작업하는 방법을 다뤄요.
연습 문제를 내려받고 제출하려면 exercism 명령줄 도구가 필요해요.
exercism CLI 문서를 참고해요.
기본 exercism 도구에서 번거로운 점 하나는, 연습 문제를 내려받은 뒤 디렉터리를 직접 변경해야 한다는 거예요.
이 래퍼 함수가 그걸 대신 처리해 줘요. ~/.bashrc에 저장해 두세요.
exercism () {
local out
readarray -t out < <(command exercism "$@")
printf '%s\n' "${out[@]}"
if [[ $1 == "download" && -d "${out[-1]}" ]]; then
cd "${out[-1]}" || return 1
fi
}
이것은 셸 _스크립트_가 될 수 없고, 반드시 셸 _함수_여야 해요. 셸 스크립트는 자식 프로세스에서 실행되기 때문에, 현재 셸의 환경(예: 현재 작업 디렉터리)에는 영향을 줄 수 없어요.
bash 트랙의 테스트에는 bats를 사용해요.
가상의 "whatever" 연습 문제에 대한 테스트는 이렇게 실행해요:
cd /path/to/your/exercise_workspace/bash/whatever
bats whatever.bats
로컬에서 테스트를 실행하면서 디버그 출력을 보고 싶다면, 로컬에서 디버깅하기를 참고해요.
bats-core 설치하기즐겨 쓰는 패키지 관리자로 설치할 수 있을 거예요:
Homebrew를 쓰는 macOS에서는 이렇게 하면 돼요:
$ brew install bats-core
==> Downloading https://github.com/bats-core/bats-core/archive/v1.1.0.tar.gz
==> Downloading from https://codeload.github.com/bats-core/bats-core/tar.gz/v1.1.0
######################################################################## 100.0%
==> ./install.sh /usr/local/Cellar/bats-core/1.1.0
🍺 /usr/local/Cellar/bats-core/1.1.0: 13 files, 55KB, built in 4 seconds
bats 패키지도 있어요.
실수로 그걸 설치하면 안 돼요: bats-core를 설치하세요.bats는 Fedora 30 이상용으로 패키징되어 있어서, 이렇게 설치할 수 있어요
sudo dnf install bats
다른 Linux 배포판에서는 우리가 사용하는 bats 구현이 편리하게 패키징되어 있지 않을 수 있어요.
가장 좋은 방법은 소스에서 설치하는 거예요.
/usr/local 아래에 설치하고 싶다면
git clone https://github.com/bats-core/bats-core
cd bats-core/
sudo ./install.sh /usr/local
그다음 /usr/local/bin이 $PATH에 있다고 가정하면, 이제 이렇게 할 수 있어요:
$ bats
Error: Must specify at least one <test>
Usage: bats [-cr] [-f <regex>] [-j <jobs>] [-p | -t] <test>...
bats [-h | -v]
...
$ git clone https://github.com/bats-core/bats-core.git
$ cd bats-core
$ ./install.sh $HOME
참고: 오래된 https://github.com/sstephenson/bats.git를 사용하다가 cp: cannot create symbolic link '${HOME}/bin/bats': No such file or directory 같은 오류를 발견하면, bin/bats/libexec/ 폴더의 내용을 ${HOME}/bin/에 직접 복사해야 해요.
MinGW bash에서 최신 bats 버전이 잘 동작하지 않는다는 보고가 있어요. 설치 스크립트를 실행하기 전에 이렇게 하는 게 좋아요:
$ git checkout v1.1.0
테스트에 나오는 여러 assert* 명령의 의미가 궁금하면, bats-assert 라이브러리 문서를 참고해요.
연습 문제를 푼다는 것은 모든 테스트를 통과시키는 거예요. 기본적으로 테스트를 실행하면 첫 번째 테스트 하나만 실행돼요. 이건 의도된 것으로, 그 테스트 하나를 통과시키는 데만 집중할 수 있게 해줘요. 그 테스트가 통과하면, 다른 테스트 앞에 붙어 있는
[[ $BATS_RUN_SKIPPED == true ]] || skip
주석을 주석 처리하거나 삭제해서 다음 테스트를 활성화할 수 있어요.
skip 주석이 붙은 테스트를 포함해 모든 테스트를 실행하려면, 환경 변수 BATS_RUN_SKIPPED를 true로 설정하면 돼요.
bats를 실행하는 동안에만 이 값을 설정하는 방법 중 하나는 이거예요:
BATS_RUN_SKIPPED=true bats exercise_name.bats
타이핑을 줄이려고 래퍼 함수를 쓰면 편리해요:
bats() {
BATS_RUN_SKIPPED=true command bats *.bats
}
그러면 이렇게만 테스트를 실행할 수 있어요:
bats
bats
bats-core는 원래 bats 구현에서 포크되었어요.
sstephenson/bats 프로젝트는 버그가 꽤 많았고 방치된 상태였어요.
소유권은 2017년에 넘겨졌어요: sstephenson/bats#150 (댓글).
원래의 sstephenson/bats가 설치되어 있다면 (bats -v로 버전 번호가 1.0 미만인지 확인해 보세요), bats-core로 바꾸는 게 좋아요. 그러지 않으면 설명할 수 없는 테스트 실패를 겪게 될 수도 있어요.