Bash 트랙에서 테스트하기

Exercism에서 Bash 연습 문제를 테스트하는 방법을 배워요


Exercism 웹사이트의 온라인 에디터를 사용해서 연습 문제를 풀 수 있어요. 또는 연습 문제를 컴퓨터로 내려받아 로컬에서 푼 다음, Exercism에 제출해도 돼요. 이 문서의 나머지 부분에서는 로컬에서 작업하는 방법을 다뤄요.

Exercism CLI

연습 문제를 내려받고 제출하려면 exercism 명령줄 도구가 필요해요. exercism CLI 문서를 참고해요.

exercism 도구용 래퍼 함수

기본 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 설치하기

즐겨 쓰는 패키지 관리자로 설치할 수 있을 거예요:

Mac (brew)의 경우

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
  • homebrew 생태계에는 예전 bats 패키지도 있어요. 실수로 그걸 설치하면 안 돼요: bats-core를 설치하세요.

Linux의 경우

Fedora 30 이상

bats는 Fedora 30 이상용으로 패키징되어 있어서, 이렇게 설치할 수 있어요

sudo dnf install bats

기타 Linux

다른 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]
...

Windows (MINGW64/Cygwin)의 경우

$ 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

bats-assert

테스트에 나오는 여러 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로 바꾸는 게 좋아요. 그러지 않으면 설명할 수 없는 테스트 실패를 겪게 될 수도 있어요.