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拡張子のscratchファイルを解析し、型チェックと評価を行います。型チェックと評価が済んだら、その項をコードベースに追加できます。
  • ls: 名前空間の中身を一覧表示します
  • view: 与えられたUnison定義のソースコードを表示します
  • ui: ローカルコードベースUIを開きます
  • exit: UCMを閉じます