Elixir

Tokyo.ex #8 LT toku_bass


whoami

スクリーンショット 2017-11-26 13.07.12.png


  • Elixir歴2ヶ月弱

  • 10/29 Elixir初心者向けハンズオン vol2 お世話になりました


本題

map,struct用のテストフレームワークを作った話

構造体やMapのテストの一部だけテストしたいとき、一つずつ書くのが面倒

これを

assert Map.get(msg1, "name") ==  "Foo"

assert Map.get(msg1, "token") == "AAAAA"

こういう感じでかきたい

assert msg1, %{ "name" => "foo", token => "AAAAA"}


車輪の再発明?

調べたけど、なさそう -> ほんとか?

とりあえず、再発明でもいいから勉強がてら書こう


調査記録

ExUnitとPowerAssert


=でパターンマッチの場合

スクリーンショット 2017-11-24 11.20.36.png


ExUnit.Case

スクリーンショット 2017-11-24 11.17.34.png


PowerAssert

スクリーンショット 2017-11-24 11.17.06.png


==比較

exunit_equal.png


ExUnit.Case

差分は見やすい

exunit_equal_result.png


PowerAssert

すべて赤文字で出力されてしまうが、差分は出力してくれる

power_assert_equal_result.png


match?

assert match?(patter,expr)


ExUnit

スクリーンショット 2017-11-24 11.27.05.png


PowerAssert

変数の中身が表示されない

スクリーンショット 2017-11-24 11.27.18.png


patternの側に変数が使えない

Kernel.match?の実装はただのcase

  defmacro match?(pattern, expr) do

quote do
case unquote(expr) do
unquote(pattern) ->
true
_ ->
false
end
end
end


できるといいこと

match?で==のような綺麗な差分を出したい

match?でpatternの側にも変数を使いたい


ExUnitの実装に乗っかる


  • お手軽にライブラリつくりたい

  • 無理して作ってテストライブラリにバグがあるのは最悪

  • Mapをマージして==で比較すればいいのでは


作ったもの

struct_assert


デモ

テストを実行してみる

struct_assert_test.exs

callback_test.exs


おわりに


今後の豊富


  • ライブラリ書いてく

  • CPANのエコシステム(を導入できるといいなぁ)


    • CPAN Testers