Unison 트랙에서 테스트하기

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


Unison Codebase Manager 알아보기

Unison Codebase Manager(UCM)는 Unison 프로그래밍 언어를 실행하고, 직접 작성하고 저장한 Unison 코드를 살펴볼 수 있게 해 주는 도구예요.

💡 기억해요: Unison 코드는 텍스트 기반 파일 내용으로 저장되지 않아요. 그래서 Unison 프로그램을 수정하고 실행할 수 있게 해 주는 도구가 필요해요.

Unison 코드를 작성하는 건, 원하는 터미널을 열고 Unison 코드를 작성할 디렉터리에서 ucm 명령을 실행하기만 하면 돼요. 그다음 좋아하는 텍스트 편집기로 scratch.u나 hello.u처럼 .u 확장자를 가진 파일을 만들거나 열면 돼요. 작업 흐름의 대부분은 실행 중인 ucm 명령줄 인스턴스와 .u 파일 사이를 오가는 것이 될 거예요. 파일을 저장하면 UCM이 .u 확장자 파일의 변경 사항을 자동으로 감지해요.

Unison 코드베이스는 디렉터리 구조 대신 "네임스페이스"로 구성돼요. 표준 라이브러리에서 쓸 만한 함수와 데이터 타입을 찾기 위해 base라는 네임스페이스를 살펴보게 되고, Unison 코드를 작성하면서 나만의 네임스페이스도 만들어 나가게 돼요. UCM에서는 코드베이스 안을 ls와 view 명령으로 탐색해요. 각각 네임스페이스의 내용을 나열하고 소스 코드를 보는 데 쓰여요.

UCM CLI로 코드베이스를 탐색하고 볼 수도 있지만, 작업 내용을 보기 좋은 그래픽으로 보고 싶을 수도 있어요. 그럴 때는 UCM CLI에서 ui 명령을 실행하면 돼요. 그러면 코드베이스에 있는 코드를 볼 수 있는 브라우저 창이 열려요. 로컬 코드베이스 UI는 base라고 하는 표준 라이브러리의 함수를 살펴보기에도 아주 좋은데, 연습 문제를 푸는 데 유용할 수 있어요. 로컬 코드베이스 UI에 대해 더 알아보기.

Unison 언어 둘러보기로 Unison의 프로그래밍 작업 흐름을 연습할 수 있어요.

Exercism 테스트 환경 설정

간단히 살펴보기

  1. project.create 명령으로 새 프로젝트를 만들고 이름을 지정해요 (예: project.create hello-world)

  2. UCM이 연습 문제 디렉터리를 지켜보는 상태에서 <myFileName>.u 파일을 수정해요

  3. <myFileName>.u 파일을 저장해요

  4. 파일이 타입 검사를 통과하면 UCM에서 add 또는 update 명령을 실행해요

    • 파일이 타입 검사를 통과하지 못하면 컴파일될 때까지 <myFileName>.u 파일의 코드를 수정해요
  5. UCM CLI에서 load <myFileName>.test.u 명령을 실행해 테스트를 스코프로 불러와 실행해요

자세히 살펴보기

명령줄에서 Exercism 문제를 푼다면, 대부분 주어진 연습 문제의 이름을 딴 디렉터리에서 해답을 구현하게 될 거예요. 예를 들어 연습 문제가 hello-world라면, 명령줄에서 ~/exercism/unison/hello-world로 cd한 뒤 ucm을 열고 ucm에서 프로젝트를 만들어요 (예: project.create hello-world). hello.u 파일에서 구현을 수정하고, 구현이 만족스러우면 Unison Codebase Manager CLI(UCM)에서 add 또는 update 명령을 입력해 파일에 있는 작업 내용을 코드베이스에 추가해요.

각 연습 문제의 테스트가 들어 있는 파일은 확장자가 .test.u예요. UCM에서 load 명령을 사용해 테스트를 스코프로 불러와 실행하면 돼요. load 명령은 파일 경로를 인자로 받아요. hello world 연습 문제와 hello-world 프로젝트에서는 이렇게 보일 거예요:

hello-world/main> load hello.test.u

UCM에서 스코프로 불러온 용어에 대한 메시지와, 무엇보다 중요한 테스트 실행 결과를 볼 수 있어요:


  ⍟ These new definitions are ok to `add`:

    hello.test : Test.Test
    tests      : [Result]

Now evaluating any watch expressions (lines starting with
`>`)... Ctrl+C cancels.


  6 | test> tests = runAll [hello.test]

  🚫 FAILED

테스트가 처음에 통과하지 못했다고 해봐요. 다시 myExercise.u 파일을 편집하러 돌아가고, 저장한 뒤에는 update를 할 수 있어요

I found and typechecked these definitions in ~/Exercism/unison/hello-world/hello.u. If you do an
`add` or `update`, here's how your codebase would change:

  ⍟ These names already exist. You can `update` them to your new definition:

    hello : Text

hello-world/main> update

⍟ I've updated these names to your new definition:

  hello : Text

이제 테스트를 다시 불러와서 달라진 게 있는지 확인해 볼까요!

hello-world/main> load hello.test.u
  Now evaluating any watch expressions (lines starting with `>`)... Ctrl+C cancels.


  6 | test> tests = runAll [hello.test]

  ✅ Passed : Passed 1 tests.

유용한 UCM 명령

코드베이스와 상호작용할 수 있는 사용 가능한 명령 목록을 보려면 Unison Codebase Manager CLI에서 help를 실행해요. UCM 명령 목록은 저희 웹사이트에도 설명되어 있어요. 다음은 도움이 될 만한 몇 가지예요:

  • add: .u 파일의 새 정의를 코드베이스에 추가해요.
  • update: add와 비슷하지만, 파일의 정의가 기존 정의와 이름이 같으면 그 이름이 새 정의를 가리키도록 업데이트해요.
    • 기존 정의에 의존하는 것이 있으면, update가 가능한 경우 변경 사항을 자동으로 전파하고, 그렇지 않으면 나중에 리팩터링할 수 있도록 todo 항목을 만들어요.
  • load: 주어진 .u 확장자 스크래치 파일을 파싱하고 타입 검사한 뒤 평가해요. 타입 검사와 평가가 끝나면 용어를 코드베이스에 추가할 수 있어요.
  • ls: 네임스페이스의 내용을 나열해요
  • view: 주어진 Unison 정의의 소스 코드를 봐요
  • ui: 로컬 코드베이스 UI를 열어요
  • exit: UCM을 닫아요