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