前回の記事
テストを書こう
さて、前回関数の仕様が確定したので実際に実装してしまいたいところですが、先にテストケースをいくつか書いてしまいましょう。何度もiexで実行するのは手間ですからね。
なによりElixirはイミュータブルですから単体テストも効果的です。
まっさらな状態だとこんなテストモジュールになるかと思います。
test/summary_test.exs
defmodule SummaryTest do
use ExUnit.Case
doctest Summary
end
end
doctestに関してはこちらの記事が参考になりますので、参考にしてみてください。
Elixir の doctest 書き方まとめ
この記事ではdoctestに関しては割愛します。
こんな感じでひたすらテストケースを作成してみます。
実装する際にサンプルで使用しそうな値を予めassertで書いてしまうと良いでしょう。
特に思い浮かばない場合は0の場合、1の場合、多数の場合と境界値を意識するとテストケースが思い浮かぶのではないでしょうか。
test/summary_test.exs
defmodule SummaryTest do
use ExUnit.Case
#doctest Summary
test "1行の場合" do
data = [%{"name" => "sato", "script" => "hello"}]
assert data
|> Summary.by_key("name") ==
[%{"name" => "sato", "contents" => [%{"script" => "hello"}]}]
end
test "同じキーが2行の場合" do
data = [%{"name" => "sato", "script" => "hello"}, %{"name" => "sato", "script" => "hello"}]
assert data
|> Summary.by_key("name") ==
[%{"name" => "sato", "contents" => [%{"script" => "hello"}, %{"script" => "hello"}]}]
end
test "違うキーが2行の場合" do
data = [%{"name" => "sato", "script" => "hello"}, %{"name" => "tanaka", "script" => "hello"}]
assert data
|> Summary.by_key("name") ==
[
%{"name" => "sato", "contents" => [%{"script" => "hello"}]},
%{"name" => "tanaka", "contents" => [%{"script" => "hello"}]}
]
end
test "違うキーで3行の場合" do
data = [%{"name" => "sato", "script" => "hello"}, %{"name" => "tanaka", "script" => "hello"}]
assert data
|> Summary.by_key("name") ==
[
%{"name" => "sato", "contents" => [%{"script" => "hello"}]},
%{"name" => "tanaka", "contents" => [%{"script" => "hello"}]}
]
end
test "違うキーで4行の場合" do
data = [
%{"name" => "sato", "script" => "hello"},
%{"name" => "tanaka", "script" => "hello"},
%{"name" => "sato", "script" => "hello"},
%{"name" => "tanaka", "script" => "hello"}
]
assert data
|> Summary.by_key("name") ==
[
%{"name" => "sato", "contents" => [%{"script" => "hello"}]},
%{"name" => "tanaka", "contents" => [%{"script" => "hello"}]},
%{"name" => "sato", "contents" => [%{"script" => "hello"}]},
%{"name" => "tanaka", "contents" => [%{"script" => "hello"}]}
]
end
test "一部同じキーで4行の場合" do
data = [
%{"name" => "sato", "script" => "hello"},
%{"name" => "tanaka", "script" => "hello"},
%{"name" => "tanaka", "script" => "hello"},
%{"name" => "sato", "script" => "hello"}
]
assert data
|> Summary.by_key("name") ==
[
%{"name" => "sato", "contents" => [%{"script" => "hello"}]},
%{"name" => "tanaka", "contents" => [%{"script" => "hello"}, %{"script" => "hello"}]},
%{"name" => "sato", "contents" => [%{"script" => "hello"}]}
],
[
%{
"script" => "hello",
"contents" => [
%{"name" => "sato"},
%{"name" => "tanaka"},
%{"name" => "tanaka"},
%{"name" => "kobayashi"}
]
}
]
end
end