Как сделать скриншот при неудаче с помощью гончей / эликсира - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь сделать скриншот, используя 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 Ответ

0 голосов
/ 27 сентября 2019

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

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 и сохранит снимок экрана при любой ошибке.В качестве бонуса он добавляет к скриншоту название теста. Большим недостатком является то, что вы теряете трассировку, поэтому сложнее определить ошибочную строку тестового кода. (решается с помощью 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

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

...