5

我在 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"
4

1 回答 1

9

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

无论如何,解决方案是在每个场景调用结束时创建一个上下文或挂钩来重置会话。出于测试目的,我创建了一个上下文,内容为“并且我重置了会话”。

我这样定义:

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

当我在两种场景结束时调用该上下文时,它可以解决问题。所以我想我会继续做一个场景后的钩子来为我解决这个问题。

于 2013-06-25T20:23:35.973 回答