【问题标题】:Postgres connection timeout in Wallaby acceptance tests小袋鼠验收测试中的 Postgres 连接超时
【发布时间】:2017-12-20 08:29:55
【问题描述】:

我在 Wallaby 测试中遇到了几个 Postgres 超时问题。我得到的错误是:

[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

当我尝试使用assert_has(link("Sign Out") 之类的 CSS 断言链接 click(button("Submit")) 事件时(我认为我在提交表单时遇到问题的所有事件,&lt;a&gt; 链接似乎都可以正常工作)时,它会在本地发生.如果我从上下文中传递会话而不是将两者连接在一起,那似乎没问题。但是,它在 CI 服务器 (Travis) 上仍然失败。

听起来有点像上面描述的问题(“在我们的测试套件中,通常会出现执行操作的错误,并且在没有等待操作完成的情况下进入另一个页面,从而产生竞争条件”),但它始终失败或成功,而不是不稳定,所以我想知道是否没有我缺少的东西。

这是失败的 PR,如果您想查看实际代码: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 上遇到的问题无关。如下所述,这可能与连接以某种方式保持登录状态有关。

【问题讨论】:

  • 你能从你的帖子中删除phoenix标签吗?此标签属于 Phoenix 数据库。

标签: postgresql elixir phoenix-framework wallaby.js


【解决方案1】:

问题不是你期望的。断言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”可见:

【讨论】:

  • 抱歉,我让事情变得不必要的混乱。我通过删除显式返回会话的registration_page.ex 的第30 行在本地进行测试。我相信你是对的,CI 问题可能是我的会话插件或其他问题而不是我的小袋鼠配置的问题。看起来其他验收测试正在那里通过,所以这可能与我的身份验证插件或相关逻辑有关。谢谢!
【解决方案2】:

我在测试环境中遇到了同样的问题。将此添加到数据库配置下的 config/test.exs 文件中

ownership_timeout: 60_000

这应该可以解决问题。您收到的错误是因为默认情况下设置的时间为 15000。因此,如果任何进程花费的时间超过该 Db 会引发错误。

【讨论】:

  • 将任何超时值从 15 秒增加到 60 秒都是疯狂的。如果任何东西在超过 15 秒内成功运行,它应该考虑 failing
  • @mudasobwa 如果我想在数据库中植入大量条目,我必须增加数据库的超时时间。我正在回答他发布的问题。
  • 所以不要说你不知道的事情。而 60 只是一个值,您可以根据要求使用超时
  • 增加超时绝不是一个合适的解决方案,也不应该被建议。期间。
  • time_out 的默认值最初是 5000,然后增加到 15000。然后去问 jose valim 他疯了。期间
猜你喜欢
  • 2022-07-08
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 2018-10-21
  • 2013-06-20
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多