Emacs Lisp 트랙에서 테스트하기

Exercism에서 Emacs Lisp 연습 문제를 테스트하는 방법을 알아봐요


Elisp 테스트는 회귀 테스트와 단위 테스트를 위한 Emacs Lisp 라이브러리인 ERT로 실행해요. 테스트는 여러 방법으로 실행할 수 있어요.

Emacs 안에서 대화식으로 테스트를 실행하려면 다음과 같이 해요:

  1. 테스트 파일을 열고 M-x eval-buffer RET를 입력해요
  2. M-x ert RET test-name RET로 개별 테스트를 하나씩 대화식으로 실행해요
  3. M-x ert RET t RET로 모든 테스트를 한 번에 대화식으로 실행해요 이 방법은 현재 Emacs에 로드된 모든 테스트를 실행한다는 점에 유의해요!
  4. 변경 사항을 만들었다면 테스트하기 전에 M-x eval-buffer RET를 다시 실행해요

현재 버퍼의 테스트만 실행하려면 .emacs나 init.el에 다음을 추가하면 돼요:

(defun my-eval-and-run-all-tests-in-buffer ()
  "Delete all loaded tests from the runtime, evaluate the current buffer and run all loaded tests with ert."
  (interactive)
  (ert-delete-all-tests)
  (eval-buffer)
  (ert 't))

Emacs를 다시 시작한 후에는:

  1. 테스트 파일을 열어요
  2. M-x my-eval-and-run-all-tests-in-buffer RET를 입력해요

연습 문제를 푸는 동안에는 대화식 테스트가 좋지만, 연습 문제가 제출할 준비가 되었는지 확인하고 싶을 때는 배치 모드 테스트가 더 적합해요.

터미널에서 배치 모드로 모든 테스트를 실행하려면 emacs -batch -l ert -l *-test.el -f ert-run-tests-batch-and-exit를 실행해요.

위 명령은 조금 다루기 번거로우니, 원한다면 이렇게 해봐요:

  1. $PATH에 (아마 ~/bin에) ert-run이라는 파일을 만들어요
  2. 파일 내용은 다음과 같이 해요:
    #!/usr/bin/env sh
    emacs -batch -l ert -l $1 -f ert-run-tests-batch-and-exit
    
  3. chmod +x ert-run으로 파일을 실행 가능하게 만들어요

이제 ert-run *-test.el을 호출하기만 하면 배치 모드로 테스트를 실행할 수 있어요.

다른 옵션은 문서에서 확인할 수 있어요. C-h i m ert RET

연습 문제 풀기

Emacs 자체가 elisp 인터프리터이기 때문에, 작성 중인 코드는 항상 원래의 실행 환경 안에 있어요. 폼 끝에서 C-x e를 누르면 어떤 폼이든 평가할 수 있고, M-x eval-region으로 선택 영역을, M-x eval-buffer로 버퍼 전체를 평가할 수 있어요. 이 기능은 코드를 빠르게 디버깅할 때 아주 유용해요.

제안

코드와 테스트가 모두 유효한 elisp이므로, 연습 문제 코드를 테스트와 나란히 둔 버퍼 창에서 작업하는 걸 권장해요. 예를 들면 이렇게요:

Emacs 프레임이 세로로 두 개의 윈도우로 분할된 모습을 보여 주는 스크린샷

C-x 3으로 프레임을 세로로 분할하고, C-x o로 새 윈도우로 이동한 다음, C-x C-f /path/to/file로 파일을 열어요.