Elixir Test概览

Posted by zhulinpinyu on December 19, 2016

Thanks: http://elixirschool.com/cn/lessons/basics/testing/

在根目录下运行测试:

mix test

另:同时doctest 也可以 自动测试method注释中的示例 比如

@doc """
return two part, one is hand specific by count argument

## Example

   iex> deck = Cards.create_deck
   iex> {hand,_deck} = Cards.deal(deck,1)
   iex> hand
   ["Ace of mlx"]

  """

简单的测试code示例:

defmodule CardsTest do
  use ExUnit.Case
  doctest Cards

  test "create_deck should return 9 cards" do
    deck_size = length(Cards.create_deck)
    assert deck_size == 9
  end

  test "shuffle should return random list of deck" do
    deck = Cards.create_deck
    refute deck == Cards.shuffle(deck)
  end
end

注:由于!=不能用会出现警告说 !=不会生效。所以采用refute 具体细节有待考证。实际效果就是不等于。

refute

refuteassert 的关系就像 unless 和 if 的关系一样,如果要保证某个表达式一定是假的,请使用 refute。

Test 配置

有时候我们需要在执行真正的测试之前做一下配置工作,我们可以使用 setup 和 setup_all 这两个宏。setup 在某个测试用例之前都会被运行setup_all 只会在整套测试之前运行一次。它们两个的返回值是元组:{:ok, state},其中 state 可以再后续的测试中被使用。

为了方便举例子,我们把测试代码修改一下,添加上 setup_all:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  setup_all do
    {:ok, number: 2}
  end

  test "the truth", state do
    assert 1 + 1 == state[:number]
  end
end