Fork me on GitHub

テスト

テストはソフトウェア開発の重要な一部です。このレッスンではElixirコードをExUnitを用いてテストする方法と、そのためのベストプラクティスをいくつか見てきます。

目次

ExUnit

Elixirに組み込まれているテストフレームワークはExUnitといい、コードを全面的にテストするのに必要なもの全てを含んでいます。ExUnitを見ていく前に重要なので言及しておきますが、テストはElixirスクリプトとして実装されるため、.exsをファイルの拡張子として使用する必要があります。テストを走らせる前にExUnitをExUnit.start()で開始する必要があり、これは通常test/test_helper.exs内で行われます。

プロジェクトを生成した時点で、mixは単純なテストを作ってくれていて、test/example_test.exsで見ることができます:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  test "the truth" do
    assert 1 + 1 == 2
  end
end

プロジェクトのテストはmix testで走らせることができます。実行すると下記のような出力が得られるでしょう:

Finished in 0.03 seconds (0.02s on load, 0.01s on tests)
1 tests, 0 failures

assert

以前からテストを書いているのでしたら、assertをご存知でしょう。あるいは、shouldexpectassertの役割を担っているフレームワークもあります。

assertマクロは式が真であることをテストするために使います。真ではない場合は、エラーが発生してテストが失敗します。失敗するのを試すために、先ほどの例を変更してmix testを実行してみましょう:

defmodule ExampleTest do
  use ExUnit.Case
  doctest Example

  test "the truth" do
    assert 1 + 1 == 3
  end
end

今度は先ほどとはかなり異なった形の出力が得られるはずです:

  1) test the truth (ExampleTest)
     test/example_test.exs:5
     Assertion with == failed
     code: 1 + 1 == 3
     lhs:  2
     rhs:  3
     stacktrace:
       test/example_test.exs:6

......

Finished in 0.03 seconds (0.02s on load, 0.01s on tests)
1 tests, 1 failures

ExUnitは失敗したアサーションがどこにあるか、期待された値と実際の値が何であったのかを、正確に教えてくれます。

refute

refuteassertの、ifに対するunlessのようなものです。文が常に偽となることを確かめたい場合にはrefuteを使ってください。

assert_raise

たまに、エラーが発生することをアサートする必要があるかもしれませんが、assert_raiseで行うことができます。Plugに関するレッスンでassert_raiseの例を見ていきます。

テストのセットアップ

いくつかの場合に、テスト前にセットアップを行う必要があるかもしれません。セットアップを行うために、setupsetup_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

モック

Elixirでのモックに対する単純な解答は、使うな、です。本能のままにモックへと手を伸ばしているかもしれませんが、Elixirのコミュニティや正当な理由からはとても推奨されていないものです。良いデザインの原則に従えば、その結果書かれるコードは個別の部品としてテストしやすいものになるでしょう。

衝動を抑えましょう。


このページをシェアする