週刊Elixirライブラリ2015-18

Elixirのライブラリの解説を週ごとにお届けする記事です。
解説が間違っていた場合には、コメントか@hayabusa333にご連絡くださると嬉しいです。

今回はExParametarizedについて

# ExParametarized is 何?
ExParametarizedは、ElixirのUnitTestで使用するパラメータの定義をMacroにて行い、パラメータ系のテストを簡単に増やすことができるライブラリです。

# 実行環境
OS:OS X Yosemite
Erlang:Eshell V6.5, OTP-Version 18
Elixir:v1.0.4

# ExParametarizedの実行を行うための新規プロジェクトの作成

$ mix new my_ex_parametarized
$ cd my_ex_parametarized

# HexにてExParametarizedをインストールするために設定ファイルの記載を行う

$ vim mix.exs

mix.exsの内容は下記となります。

defmodule MyExParametarized.Mixfile do
  use Mix.Project

  def project do
    [app: :my_ex_parametarized,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  # Configuration for the OTP application
  #
  # Type `mix help compile.app` for more information
  def application do
    [applications: [:logger]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:mydep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #
  # Type `mix help deps` for more examples and options
  defp deps do
    [{:ex_parametarized, "~> 0.4.1"}]
  end
end

# 依存関係の解決を行います。

$ mix deps.get

# テスト様にコードを記載

$ vim lib/my_ex_parametarized.ex 

ExParametarizedがメソッドの引数でも使用できることを確認するため、確認用のコードを記載

defmodule MyExParametarized do
  def add(a, b) do
    a + b
  end
end
<||
<span class="deco" style="font-weight:bold;"># テストコードを記載</span>
>||
$ vim test/my_ex_parametarized_test.exs 

ExParametarizedを実際に使用したテストコードを記載

defmodule MyExParametarizedTest do
  use ExUnit.Case, async: true
  use ExUnit.Parametarized # ExParametarized

  # ExParametarized のサンプルコードを記載
  test_with_params "add params",
    fn (a, b, expected) ->
      assert a + b == expected
    end do
      [
        #{a, b, expected} というふうにパラメータが設定される
        {1, 2, 3}, # 正常にテストが成功するパターン
        {1, 4, 3}, # テストが失敗するパターン
        "fail_test": {1, 4, 50} # テストが失敗し、テストの結果に"fail_test" と記載されるパターン
      ]
  end

  # メソッドの引数としてパラメータが使用できることも確認
  test_with_params "add params method",
    fn (a, b, expected) ->
      assert MyExParametarized.add(a, b) == expected
    end do
      [
        {1, 2, 3},
        "fail_test": {1, 4, 50}
      ]
  end

  # ExParametarized自体がMacroで記載されているため引数を複数指定しても動くことを確認
  test_with_params "add params2",
    fn (a, b, c, d, e, f, g, h, i, j, k, l, m, n, expected) ->
      assert a + b + c + d + e + f + g + h + i + j + k + l + m + n == expected
    end do
      [
        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3},
      ]
  end

end 

# ExParametarized を実行してみる

$ mix test



  1) test add params_fail_test_num2 (MyExParametarizedTest)
     test/my_ex_parametarized_test.exs:5
     Assertion with == failed
     code: a + b == expected
     lhs:  5
     rhs:  50
     stacktrace:
       test/my_ex_parametarized_test.exs:5

.

  2) test add params method_fail_test_num1 (MyExParametarizedTest)
     test/my_ex_parametarized_test.exs:16
     Assertion with == failed
     code: MyExParametarized.add(a, b) == expected
     lhs:  5
     rhs:  50
     stacktrace:
       test/my_ex_parametarized_test.exs:16

.

  3) test add params_num1 (MyExParametarizedTest)
     test/my_ex_parametarized_test.exs:5
     Assertion with == failed
     code: a + b == expected
     lhs:  5
     rhs:  3
     stacktrace:
       test/my_ex_parametarized_test.exs:5



  4) test add params2_num0 (MyExParametarizedTest)
     test/my_ex_parametarized_test.exs:26
     Assertion with == failed
     code: a + b + c + d + e + f + g + h + i + j + k + l + m + n == expected
     lhs:  14
     rhs:  3
     stacktrace:
       test/my_ex_parametarized_test.exs:26



Finished in 0.06 seconds (0.06s on load, 0.00s on tests)
6 tests, 4 failures

# まとめ
今回はElixirのExUnitを拡張するExParametarizedというライブラリを紹介いたしました。
一度、テストケースを作成してしまえばパラメータを増やすことにより強化値やパラメータ系のテストを簡単に増やすことができるので皆様使用してみてはいかがでしょうか?

それでは皆さま、良いElixirライフを