Как сделать снимок экрана при неудаче с помощью гончей / эликсира

Я пытаюсь сделать снимок экрана с помощью take_screenshot() (Hound). Мне просто нужно сделать снимок экрана в случае неудачи.

Я пробовал попробовать / спасти, однако блок спасения всегда выполняется, даже если утверждение не выполняется.

try do
   // some page elements action
   assert visible_page_text(), "Hello World"
rescue
  _ -> take_screenshot()
end

Я тоже пробовал,

try do
   // some page elements action
   assert visible_page_text(), "Hello World"
catch
  _ -> take_screenshot()
end

Я хочу, чтобы если утверждение не удалось, только тогда он должен сделать снимок экрана.

1 ответ

С небольшой модификацией ваш код работает:

try do
   // some page elements action
   assert visible_page_text() =~ "Hello World"
catch
  error ->
    take_screenshot()
    raise error
end

Или превратите его в макрос:

  # assert screenshot on failure
  defmacro assert_sof(assertion) do
    quote do
      try do
        assert unquote(assertion)
      rescue
        error ->
          take_screenshot()
          raise error
      end
    end
  end

И назовите это так:

assert_sof visible_page_text() =~ "Hello World"

Обновление: как вы упомянули, при выполнении утверждения будут сниматься только скриншоты. Однако это можно исправить.

Вот макрос, который поместит содержимое всего теста в блок try / rescue и сохранит снимок экрана при любой ошибке. В качестве бонуса к снимку экрана добавляется имя теста. Большой недостаток заключается в том, что вы теряете stracktrace, поэтому труднее определить сбойную строку тестового кода.(решено с помощьюcatch вместо того rescue) Поместите макрос в support/conn_case.ex или где-нибудь еще, если хотите:

def MyAppWeb.ConnCase
  # ...

  # Test and take screenshot on failure. Only works for hound tests.
  defmacro test_sof(message, var \\ quote do _ end, contents) do
    prefix = String.replace(message, ~r/\W+/, "-")
    filename = Hound.Utils.temp_file_path(prefix, "png")

    quote do
      test unquote(message), unquote(var) do
        try do
          unquote(contents)
        catch
          error ->
            take_screenshot(unquote(filename))
            raise error
        end
      end
    end
  end

  using do
    quote do
      # Import conveniences for testing with connections
      use Phoenix.ConnTest
      import MyAppWeb.ConnCase, only: [test_sof: 2, test_sof: 3] # <- Add this line
      # ...
    end
  end

  # ...
end

И назовите это обычным тестом:

test_sof "form with valid data" do
  navigate_to "/form"
  click({:id, "test"})
  assert visible_page_text() =~ "test successful"
end

Теперь он должен работать для всех видов ошибок.

Другие вопросы по тегам