スポンサーリンク

2015年10月2日

[Elixir]マクロだってテストしたい!

とある錬金術師の万能薬(Elixir)

Goal

ExUnitからのマクロのテスト方法を習得する。

Dev-Environment

OS: Windows8.1
Erlang: Eshell V7.1, OTP-Version 18.1
Elixir: v1.1.1

Wait a minute

マクロをはどうやってExUnitでテストしたらいいのでしょうか?
丁度良く、友人から強だゲフンゲフン・・・快くお貸し頂いたMetaprogramming Elixirにある方法を、試してみようと思います。

Index

Macro test with ExUnit
|> Before you start
|> Macro test with ExUnit

Before you start

始める前に準備をしましょう!

Example:

>cd path/to/project
>mix new macro_sample
>cd macro_sample
>mix test
よし、ではやっていきましょう!!

Macro test with ExUnit

自作したマクロをExUnitでテストするにはどうすればいいのでしょうか?
結論から言えば、別に難しいことはないです。
難しかったら、誰も使わない気がしますが(笑)
まずは、テスト用の適当なマクロを作成してしまいましょう。

File: lib/macro_sample.ex

defmodule MacroSample do
  defmacro sample(string) do
    quote do
      unquote(string)
    end
  end
end
続いてテストコードです。

File: test/macro_sample_test.exs

ExUnit.start
Code.require_file("lib/macro_sample3.ex")

defmodule MacroSampleTest do
  use ExUnit.Case
  import MacroSample

  test "Ensure loaded?" do
    assert Code.ensure_loaded?(MacroSample3)
  end
end
Code.require_file/2で対象のファイルをrequireしています。
その後、importしています。
Code.ensure_loaded?/1では、読み込んだモジュールがロードされているか確認しています。
ロードされていればtrueを返しています。
テストを実行してみましょう。

Example:

>mix test
.

Finished in 0.09 seconds (0.08s on load, 0.01s on tests)
1 test, 0 failures

Randomized with seed 738000
最初のテストはパスしました。
それでは、本題のマクロをテストコードで使ってみましょう。
といっても、既に読み込みもできているのが確認できているので、後は普通の関数と変わりませんね。
テストコードを追加します。

File: test/macro_sample_test.exs

...

defmodule MacroSampleTest do
  ...

  test "Macro test sample" do
    assert MacroSample.sample("hoge") == "hoge"
  end
end
テスト用に作ったマクロは、渡した引数をそのままunquoteしているだけです。
なので文字列:hogeを渡したら、文字列:hogeが返ってくるはずです。
テストを実行しましょう!

Example:

>mix test
..

Finished in 0.07 seconds (0.07s on load, 0.00s on tests)
2 tests, 0 failures

Randomized with seed 622000
テストが通過しました。

Speaking to oneself

もっと難しいマクロのテストをどうするんだ?とかとか色々とまだあるのですが、
最初の足掛かりとしてはこれで良いです。
気が向いたら続きの記事作ります。

Bibliography

人気の投稿