Тайм-аут соединения Postgres в приемочных тестах Wallaby
У меня есть пара проблем с тайм-аутами Postgres в моих тестах Wallaby. Я получаю ошибку:
[error] Postgrex.Protocol (#PID<0.349.0>) disconnected: ** (DBConnection.ConnectionError) owner #PID<0.566.0> timed out because it owned the connection for longer than 15000ms
Это происходит локально, когда я пытаюсь click(button("Submit"))
событие (я думаю, что все те, с которыми у меня были проблемы, делают отправку формы, <a>
ссылки вроде бы работают нормально) с утверждением CSS вроде assert_has(link("Sign Out")
, Если я пропущу сессию из контекста, а не соединю их вместе, это будет нормально. Тем не менее, он все еще не работает на сервере CI (Travis).
Это похоже на проблему, описанную выше ("часто в нашем тесте встречается ошибка, когда выполняется действие, и вы переходите на другую страницу, не дожидаясь завершения действия, создавая состояние гонки"), но это не удается или завершается успешно скорее, чем то, чтобы быть облупленным, поэтому мне интересно, нет ли чего-то, что я пропускаю.
Вот пиар, который не работает, если вы хотите увидеть фактический код: https://github.com/solid-af/cheese_log/pull/18
Я должен также упомянуть, что (при локальном тестировании) это выглядит как утверждение, которое не выполняется после того, как тайм-аут должен был пройти успешно. Если я уберу явный возврат сессии в RegistrationPage.register_with
линия, которая терпит неудачу, RegistrationPage.assert_registered()
, я имею screenshot_on_failure
включенный. На скриншоте видно, что форма заполнена, но не отправлена, а руководство take_screenshot()
строка выше показывает домашнюю страницу с "успешно зарегистрированным" текстом. Супер странно!
|> RegistrationPage.register_with(@valid_attrs)
|> take_screenshot()
|> RegistrationPage.assert_registered()
редактировать: хотя проблемы, с которыми я сталкиваюсь локально, кажется, не связаны с проблемой, с которой я сталкиваюсь в CI. Как указано ниже, это, скорее всего, связано с тем, что соединение остается каким-либо образом подключенным.
2 ответа
Проблема не в том, где вы ожидаете. Утверждение RegistrationPage.assert_registered()
преуспевает. У вас есть проблемы с выходом из системы и последующим вызовом Page.click_sign_in()
выходит из строя. По сути, ваш тест остается в системе навсегда.
Я изменил код в sign_in_test.exs
посетить домашнюю страницу и сделать снимок экрана:
test "user can sign in", %{session: session} do
session
|> Page.visit_home_page()
|> Page.click_sign_in()
|> SignInPage.click_register_link()
|> RegistrationPage.register_with(@valid_attrs)
|> RegistrationPage.assert_registered()
|> Page.click_sign_out()
|> Page.visit_home_page()
|> take_screenshot() # HERE
|> Page.click_sign_in()
|> SignInPage.sign_in_with(@valid_attrs)
|> SignInPage.assert_signed_in()
end
И скриншот показывает, что есть еще “Sign Out”
видно:
У меня та же проблема в тестовой среде. Добавьте это в файл config/test.exs в разделе базы данных config.
ownership_timeout: 60_000
Это должно сделать свое дело. Ошибка, которую вы получаете, заключается в том, что по умолчанию установлено время 15000. Поэтому, если какой-либо процесс занимает больше времени, чем Db, выдает ошибку.