YAMLScript 트랙에서 테스트하기

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


YAMLScript로 작성한 Exercism 연습 문제 풀이를 테스트하는 건 아주 쉬워요. 실행하기도 쉽고 이해하기도 쉽죠.

연습 문제 디렉터리에서 make test를 실행하기만 하면 돼요.

처음 make test를 실행하면 모든 테스트가 실패해요. 아직 테스트를 풀 코드를 하나도 작성하지 않았기 때문이죠.

일반적인 연습 문제 개발 과정은 make test로 시작해서, 한 번에 테스트 하나씩 집중하면서 그 테스트를 통과시키는 코드를 작성하는 거예요. 모든 테스트가 통과하면 끝이에요!

덤으로, make test를 실행하면 현재 연습 문제에 필요한 ys YAMLScript 인터프리터의 올바른 버전이 올바른 위치(/path/to/exercism/yamlscript/.local/)에 설치되어 있는지도 확인해 줘요. 덕분에 시작하기 전에 ys를 미리 설치할 필요조차 없어요!

연습 문제 디렉터리 구성

the-great-exercise라는 연습 문제를 작업하고 있다면, exercism download --exercise=the-great-exercise --track=yamlscript를 실행했을 때 /path/to/exercism/yamlscript/the-great-exercise 디렉터리가 만들어져요.

이 디렉터리 안에서 테스트 파일은 the-great-exercise-test.ys, 풀이 프로그램 파일은 the-great-exercise.ys라는 이름이에요. 연습 문제 설명이 담긴 README.md 파일과, 막혔을 때 도움이 될 정보가 담긴 HELP.md 파일도 있어요.

make를 위한 파일은 Makefile과 GNUmakefile 두 개예요. 이건 테스트를 실행할 때 시스템에 설치되어 있을지도 모르는 다른 make 명령이 아니라 GNU make를 사용하고 있는지 (npi) 확인하기 위해서예요. 진짜 파일은 GNUmakefile이고, GNU make는 항상 Makefile보다 이 파일을 우선해요. 다른 make 명령은 Makefile을 사용하는데, 이 파일은 GNU make를 사용하라고 알려 주는 오류 메시지를 내요!

테스트 파일의 구조

YAMLScript 테스트는 당연히 YAMLScript로 작성해요! YAMLScript는 YAML이고 YAML은 데이터이니, 테스트도 기본적으로 그냥 데이터예요.

다음은 간단한 테스트 파일의 예시예요. 사실 acronym 연습 문제의 첫 3개 테스트랍니다. :-)

#!/usr/bin/env ys-0

use ys::taptest: :all
load: 'acronym.ys'

test::
- name: Basic
  code: abbreviate('Portable Network Graphics')
  want: PNG

- name: Lowercase words
  code: abbreviate('Ruby on Rails')
  want: ROR

- name: Punctuation
  code: abbreviate('First In, First Out')
  want: FIFO

done: 3

첫 번째 줄은 shebang 줄로, prove 명령(Makefile이 실행해요)에게 테스트를 실행할 때 prove의 기본값인 perl 대신 YAMLScript ys 인터프리터를 사용하라고 알려 줘요.

두 번째 줄은 YAMLScript의 ys::taptest TAP 테스트 라이브러리를 불러오는 use 문이에요.

참고: TAP는 테스트 스크립트와 테스트 하네스 사이의 단순한 텍스트 기반 인터페이스이고, prove는 Perl에서 TAP 테스트를 실행하는 표준 하네스예요. Perl이 워낙 어디에나 있으니, TAP와 prove를 사용하는 건 여러 언어(YAMLScript 포함)의 테스트 스위트에 아주 좋은 선택이 돼요.

use 문은 acronym.ys 풀이 프로그램을 불러와서, 이 테스트 파일이 테스트할 대상이 생기게 해요.

모든 테스트는 test 키 아래의 YAML 시퀀스에 들어 있어요.

마지막 줄의 done:은 필수이고, 테스트 하네스에게 모든 테스트가 실제로 실행되었다고 알려 줘요. 숫자(선택 사항이에요)는 실행할 것으로 예상한 테스트의 개수예요.

test 키 아래의 각 테스트는 다음과 같은 키/값 쌍을 가진 매핑이에요.

  • name: - prove -v가 출력하는 테스트 레이블이에요.
  • code: - 실행할 YAMLScript 코드예요. 이 코드는 우리가 작업 중인 풀이 프로그램의 어떤 함수를 호출해요.
  • what: - 오류가 발생할 것으로 예상하는 테스트에서는 값이 error예요. 일반적인 테스트에서는 이 쌍이 없어요.
  • want: - 테스트의 예상 결과예요. YAML 값이며 문자열, 숫자, 불리언, 시퀀스 또는 맵일 수 있어요. what:이 error라면 이 값은 예상되는 오류 메시지예요.
  • SKIP: - 이 값을 true로 설정하면 그 테스트를 건너뛰어요.
  • ONLY: - 이 값을 true로 설정하면 그 테스트만 실행해요. ONLY: 테스트가 두 개 이상이면, 그 테스트들이 모두 실행돼요.

이 정도면 Exercism 연습 문제를 YAMLScript로 테스트 주도 개발하는 데 필요한 모든 것을 알게 된 거예요!

ys::taptest 라이브러리에는 더 복잡한 테스트를 작성할 때 쓸 수 있는 다른 기능들도 있어요. 하지만 Exercism 테스트는 이미 다 작성되어 있답니다. ys::taptest 라이브러리에 대해 더 알아보려면 문서를 확인해 봐요.