В Elixir ExUnit как я могу гарантировать, что Supervisor создаст новый GeNserver? - PullRequest
0 голосов
/ 22 мая 2019

Я учусь тестировать в эликсире, и появилась эта проблема:

Когда я запускаю следующий тест, иногда он проходит, а иногда нет, я думаю, это тот факт, что у Supervisor нет времени для перезапуска GenServer:

  test "Supervisor will revive the dead gensever" do
    {:ok, pid} = KV.Supervisor.start_link([])
    KV.RegistryClient.create KV.RegistryClient, "wallet"
    [h | _] = Supervisor.which_children(pid)
    {KV.RegistryClient, pid_reg, _, _} = h
    send(pid_reg, :insta_kill)

    assert %{active: 1} = Supervisor.count_children(pid)
  end

Когда происходит, это ошибка:

1) test Supervisor will revive the dead gensever (KV.RegistryTest)
     test/kv/registry_test.exs:35
     match (=) failed
     code:  assert %{active: 1} = Supervisor.count_children(pid)
     right: %{active: 0, specs: 1, supervisors: 0, workers: 1}
     stacktrace:
       test/kv/registry_test.exs:41: (test)

Как мне предотвратить это? Тайм-аут - это хороший подход?

Ответы [ 2 ]

3 голосов
/ 23 мая 2019

Единственный способ эффективно протестировать это поведение без условий гонки - это:

  1. Убедиться, что старый процесс мертв. Это можно сделать, отслеживая процесс перед отправкой сигнала уничтожения, а затем assert_receive {:DOWN, ^monitor_ref, _, _, _}

  2. Запросите руководителя, пока активный счетчик не изменится на единицу. Это можно сделать, выполняя функцию один раз каждые 10 мсек или около того

Однако, как уже говорили другие, такое поведение гарантируется Erlang / OTP. Поэтому вместо того, чтобы проверять, действительно ли супервизор что-то перезапускает, я бы предпочел проверить, передаете ли вы надлежащую дочернюю спецификацию супервизору. Таким образом, предполагая, что супервизор запускает обработку на основе KV.Registered, я бы сделал это:

assert %{restart: :permanent} = Supervisor.child_spec(KV.Registered)

Другими словами, я бы проверял контракт с супервайзерами, не проверяя сами супервайзеры.

2 голосов
/ 23 мая 2019

Это проблема времени.Короткая версия не беспокоит тестирование OTP.ЭТО уже очень хорошо протестировано.

Но если в будущем у вас возникнет необходимость обеспечить правильную работу стартапов, чтобы понять, как запускать серверы супервизоров полезно, см. Это видео https://www.youtube.com/watch?v=2i_XrY5CCXE

...