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

Pat*_*ick 5 php bdd automated-tests phantomjs behat

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

我发现每当我通过PhantomJS而不是Selenium运行场景时,它们运行得更快(显然因为没有必须在无头浏览器模拟器中渲染).当我第一次启动PhantomJS时,它运行两种情况就好了.但是我再次运行它并且第一个场景(基本登录)失败了.

如果我重新启动PhantomJS,它会再次运行,直到第二次尝试.我很困惑.为什么我需要重新启动PhantomJS才能在第一次调用时再次通过两个测试.

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

我甚至切换了顺序,以便基本运行第二而不是第一,第一种情况(在这种情况下是高级)失败,第二种情况通过.那么世界上究竟发生了什么?

作为一个额外的奖励,我继续前进并添加了一行"然后我跟随"退出"',突然两个场景再次通过.如果不是因为它在第二种情况下工作正常,那将是有意义的.如果它已经登录,它不应该失败吗?有没有办法确保在每个场景结束时清除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"
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 9

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

无论如何,解决方案是创建上下文或钩子以在每个场景调用结束时重置会话.出于测试目的,我创建了一个上下文,内容为"我重置了会话".

我这样定义:

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

当我在两个场景结束时调用该上下文时,它解决了问题.所以我想我会继续做一个后方案例钩子,为我解决这个问题.