mmag

ハマったことメモなど

ExUnit.Caseのasyncオプションはfalseがデフォルト

直近の3エントリでは醜態を晒し、もう晒しきったと思いきや別のところで勘違いをしていたことがわかったので書いておきます。

Elixirでテストを書くときはExUnitを使うのが定石となっていまして、以下のような書き方をします。

defmodule App1Test do
  use ExUnit.Case, async: true

  test "the function" do
    assert calculate() == 3
  end

  test "the function with args" do
    assert calculate(4) == 8
  end
end

defmodule App2Test do
  use ExUnit.Case, async: true

  ...
end

2行目のuseで、諸々の必要なものがここに流し込まれるのですが、一緒にasync: trueというオプションが渡されています。これを書いておくと、他のテストと並行にテストを実行してくれます。上の例だと、App1TestApp2Testが同時に走ります。App1Testの中のテストが同時に走るわけではありません。

んで何を勘違いしていたかというと、このオプションを書かなかったときに勝手にtrueになるもんだと思い込んで、いままで書いていなかったというやつでした。ExUnit.Caseのソースには

async = !!unquote(opts)[:async]

とあるので、オプションを書かないと

async = !!(nil)

なので、並列に走らんのですな。