Тайм-аут соединения 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” видно:

Снимок экрана после click_sign_out

У меня та же проблема в тестовой среде. Добавьте это в файл config/test.exs в разделе базы данных config.

ownership_timeout: 60_000

Это должно сделать свое дело. Ошибка, которую вы получаете, заключается в том, что по умолчанию установлено время 15000. Поэтому, если какой-либо процесс занимает больше времени, чем Db, выдает ошибку.

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