当通过PhantomJS运行Behat登录测试时,它只在第一次运行时通过


When running a Behat login test through PhantomJS it only passes on the first run

我在Behat中创建了一个非常简单的登录测试来登录到我们的内部应用程序。有两种登录类型(在同一屏幕和框中完成)。有基础的和高级的。唯一的区别是,在高级情况下,登录的用户可以访问多家公司,并被要求选择一家公司进行工作。

我发现,每当我通过PhantomJS而不是Selenium运行场景时,它们都会运行得更快(显然,因为在无头浏览器模拟器中不需要渲染任何内容)。当我第一次启动PhantomJS时,它运行两种场景都很好。但后来我第二次运行它,它在第一个场景(基本登录)中失败了。

如果我重新启动PhantomJS,它会再次工作,直到第二次尝试。我对此感到非常困惑。为什么我需要重新启动PhantomJS,以便在第一次调用时再次通过两个测试。

如果我指定只希望它在后续运行中运行高级登录,那么它也会失败。如果我指定了基本登录(仍然阻止它运行这两种场景),它也会失败。但是,当我在同一个调用中运行两个场景时,第一个总是失败,第二个总是通过。

我甚至切换了顺序,使basic以第二个而不是第一个运行,第一个场景(在本例中为高级)失败,第二个通过。那么到底发生了什么呢?

作为额外的奖励,我继续添加了一行,上面写着"然后我按照"注销",突然两种情况都再次过去了。如果不是因为它在第二种情况下运行良好,这是有道理的。如果它已经登录,难道不应该同时失败吗?有没有办法确保在每个场景结束时清除PhantomJS的缓存?

Feature: Login
    Login to app using a basic user
    Login to app using a multi-company user
    @javascript
    Scenario: Basic Login
        Given I am on "/"
        And I wait a few seconds
        When I fill in "login" with "ijones"
        And I fill in "password" with "SomeP@ssword"
        And I press "LoginButton"
        And I wait a few seconds
        Then I should see "By clicking below"
        And I press "OK"
        Then I should see "Welcome"
    @javascript
    Scenario: Advanced Login
        Given I am on "/"
        When I fill in "login" with "rtyler"
        And I fill in "password" with "SomeP@ssword"
        And I press "LoginButton"
        Then I wait for the company selection box
        And I click a field "company"
        And I pick "Test Company 2"
        And I press "CompanyLoginButton"
        Then I should see "By clicking below"
        And I press "OK"
        Then I should see "Welcome"

好吧,我终于解决了这个问题。至少部分。它似乎在维持场景之间的会话。这并不能完全解释为什么这只是第一次通话。但我怀疑PhantomJS在最后一个场景关闭时保持前一个会话打开,而Mink在场景之间重建会话,但不是在最后一次场景结束后。

无论如何,解决方案是在每个场景调用结束时创建一个上下文或钩子来重置会话。出于测试目的,我创建了一个上下文,上面写着"And I reset the session"。

我这样定义:

/**
 * @Given /^I reset the session$/
 */
public function iResetTheSession() {
    $this->getSession()->reset();
}

当我在两个场景结束时调用该上下文时,它解决了问题。所以我想我会继续做一个场景后挂钩,为我处理这个问题。