테스트 생성기 알아보기

Clojure 트랙이 테스트 생성기로 연습 문제의 테스트를 만드는 방법을 알아봐요


Clojure 트랙에서는 테스트 생성기를 사용해 연습 문제의 테스트를 자동으로 만들어요. problem-specifications 저장소에 정의된 대부분의 연습 문제에는 canonical-data.json 파일이 함께 있는데, 이 파일에 담긴 표준화된 테스트 입력과 출력을 문제 구현에 활용할 수 있다는 점을 이용한 거예요.

단계

연습 문제의 테스트를 만들 때 테스트 생성기는 다음 순서로 동작해요.

  1. 연습 문제의 canonical-data.json 파일에서 테스트 케이스를 읽어요
  2. tests.toml 파일을 사용해 제외할 테스트 케이스를 걸러내요
  3. 테스트 케이스를 변환해요 (선택 사항)
  4. 연습 문제의 생성기 템플릿을 사용해 테스트 케이스를 렌더링해요
  5. cljfmt로 렌더링된 템플릿의 서식을 정리해요
  6. 서식이 정리된 템플릿을 연습 문제의 테스트 파일에 작성해요

1단계: canonical-data.json 파일 읽기

테스트 생성기는 clojure/data.json 라이브러리를 사용해 연습 문제의 canonical-data.json에서 테스트 케이스를 파싱해요.

일부 표준 데이터는 중첩 구조를 사용하기 때문에, 파싱된 테스트 케이스에는 상위 요소들의 description 속성과 테스트 케이스 자신의 description 속성을 담은 path 필드가 추가로 들어가요.

참고: 키는 키워드로 파싱돼요.

2단계: tests.toml 파일에서 제외할 테스트 걸러내기

각 연습 문제에는 tests.toml 파일이 있고, 여기에서 개별 테스트를 제외하거나 비활성화할 수 있어요. 테스트 생성기는 제외된 것으로 표시된 테스트 케이스(include = false)를 제거해요.

3단계: 테스트 케이스 변환하기 (선택 사항)

일부 연습 문제는 데이터를 렌더링하기 전에 손을 좀 봐야 할 수 있어요. 예를 들어 설명을 덜 장황하게 만들고 싶을 수 있죠.

테스트 케이스를 조정하려면 <slug>-generator 네임스페이스를 가진 .meta/generator.clj 파일을 정의해요. 테스트 케이스를 변환하는 방법에는 두 가지가 있어요.

  • 테스트 케이스 업데이트하기
  • 테스트 케이스 추가/삭제하기

테스트 케이스 업데이트하기

개별 테스트 케이스를 업데이트하려면 다음 함수를 정의해요.

(defn update-test-case
  "Update a test case"
  [test-case]
  ;; function body
)
예시

이 예시는 :path 값에서 마지막 요소만 남기고 모두 제거해요(설명을 짧게 만들어요).

(ns difference-of-squares-generator)

(defn update-test-case [test-case]
  (update test-case :path #(take-last 1 %)))

테스트 케이스 추가하거나 삭제하기

테스트 케이스를 추가하거나 삭제하려면 다음 함수를 정의해요.

(defn add-remove-test-cases
  "Add/remove test case(s)"
  [test-cases]
  ;; function body
)
Note

두 함수를 모두 정의하면 add-remove-test-cases가 먼저 호출되고, update-test-case가 그다음에 호출돼요.

4단계: 테스트 케이스 렌더링하기

그다음 (변환되었을 수도 있는) 테스트 케이스가 .meta/generator.tpl 파일로 전달되는데, 이 파일은 그 테스트 케이스를 바탕으로 테스트를 어떻게 렌더링할지 정의해요.

5단계: cljfmt로 렌더링된 템플릿의 서식 정리하기

렌더링된 템플릿은 cljfmt로 서식을 정리해요. 이렇게 하면 다음과 같은 장점이 있어요.

  • 연습 문제들이 일관된 서식으로 정리돼요
  • 템플릿을 작성할 때 공백과 정렬에 크게 신경 쓰지 않아도 돼요

6단계: 렌더링된 템플릿을 연습 문제의 테스트 파일에 작성하기

마지막으로 렌더링된 템플릿의 결과가 연습 문제의 테스트 파일에 작성돼요.

템플릿

템플릿은 hbs 라이브러리로 렌더링하는데, 이 라이브러리는 (handlebars.java를 사용해) handlebars 문법을 지원해요.

명령줄 인터페이스

테스트 생성기를 실행하는 방법에는 두 가지가 있어요.

  1. bin/generate-tests: 생성기 템플릿이 있는 모든 연습 문제의 테스트를 생성해요
  2. bin/generate-tests <slug>: 생성기 템플릿이 있다면, 지정한 연습 문제의 테스트를 생성해요