8
10

More than 5 years have passed since last update.

[Elixir] ユニットテストの書き方

Last updated at Posted at 2016-09-07

ユニットテストの書き方

mixを使うまでの間、1本のプログラムでユニットテストを書いてゆくには、たとえば以下のように書きます。

add_test.exs
ExUnit.start()

defmodule AddTest do
  use ExUnit.Case
  test "add test" do
    assert 1+1==2
    assert 1+2==2
  end
end

実行すると、

$ elixir add_test.exs 


  1) test add test (AddTest)
     add_test.exs:4
     Assertion with == failed
     code: 1 + 2 == 2
     lhs:  3
     rhs:  2
     stacktrace:
       add_test.exs:6: (test)



Finished in 0.03 seconds (0.03s on load, 0.00s on tests)
1 test, 1 failure

Randomized with seed 375518

ユニットテスト1日目のコードです。

first_test.exs
ExUnit.start()

defmodule StringTest do
  use ExUnit.Case
  test "basic" do
    assert "abc"<>"def" === "abcdef"
    assert String.length("abc") === 3
    assert String.slice("abcdef",2..3) === "cd"
    assert String.split("abc def"," ") === ["abc","def"]
    assert Enum.join(["abc","def"],",") === "abc,def"

    assert String.at("abcdef",0) === "a"
    assert String.at("abcdef",1) === "b"
    assert String.starts_with?("abcdef","abc")
    assert String.ends_with?("abcdef","def")
    assert String.trim("  abc  \n") == "abc"
    assert String.upcase("aBc") == "ABC"
    assert String.downcase("AbC") == "abc"
    assert String.to_integer("16") == 16
    assert String.to_integer("1E",16) == 30
  end
  test "complex" do
    assert(Enum.map(["abc","def"],&String.upcase(&1)) == ["ABC","DEF"])
    assert Enum.map(["10","20"],&(String.to_integer(&1))) == [10,20]
    assert Enum.map(["10","20"],&String.to_integer/1) == [10,20]

    with to_i = &(String.to_integer(&1))
    do
      assert to_i.("10") == 10
      assert Enum.map(["10","20"], to_i) == [10,20]
    end

    with line = "100 200\n"
    do
      result = line 
               |> String.trim 
               |> String.split 
               |> (Enum.map &String.to_integer(&1))  # to_integer/1
      assert result == [100,200]
    end

  end
  test "embed" do
    num = 123
    assert "num=#{num}" === "num=123"    
    name = "foo"
    assert "name=#{name}" === "name=foo"    
    assert 'name=#{name}' === 'name=foo'    
  end
  test "regex" do
    assert String.to_integer("1E",16) == 30
  end
end

defmodule ListTest do
  use ExUnit.Case
  test "list" do
    assert Enum.to_list(1..3) == [1,2,3]
    assert [1,2,3]++[4,5,6] == [1,2,3,4,5,6]
    assert Enum.concat([1,2,3],[4,5,6]) == [1,2,3,4,5,6]

    with n=1,
     list=[2,3]
    do
      assert [n|list] === [1,2,3]
    end

    with list = [1,2,3]
    do
      assert (hd list) === 1
      assert (tl list) === [2,3]
    end

    with list = [1,2,3]
    do
      [head|tail] = list
      assert head === 1
      assert tail === [2,3]
    end

    with [first,second] = [1,2]
    do
      assert first == 1
      assert second == 2
    end
  end
end

その実行結果

$ elixir first_test.exs 
.....

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

Randomized with seed 703309

楽しんでね!

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10