在behat和mink中的单个功能文件中维护方案之间的会话

时间:2013-09-27 12:38:36

标签: session selenium-webdriver behat mink

我已经做了很多研发,但是我无法找到解决方案。

我需要在单个功能文件中维护不同方案之间的登录会话。 我已经创建了一个函数I am logged in,我已经在背景中写了。所以在每个场景开始时都会发生登录。但我想要的是在各个场景中维持一个登录会话。 有谁能建议。?

示例代码是:

Feature: To test the output

Background:
  Given I am logged in 

@javascript
 Scenario: To test the positive input
   When I fill in "test" with "aab"
   And I press "add"
   Then I should see "welcome"

@javascript
  Scenario:To test the negative inputs
    When I fill in "test" with "@#$@!!111"
    And I press "add"
    Then I should see "Sorry,invalid input please try again"

现在,如果另一个人审查我的代码,他就会了解正面和负面的测试用例。但每次重新加载场景时,如果我在一个功能中有50个场景,该怎么办?对于更大的项目。它在我登录的每个场景中看起来并不好看,我总共浪费了15分钟。我想要的是在单个功能文件中的每个场景之后,测试继续使用相同的登录会话。

3 个答案:

答案 0 :(得分:4)

无法完成。 Behat场景是独立的。否则,您可能会将状态泄漏从一个场景冒险到另一个场景。

您没有从正确的方向接近问题。从长远来看,牺牲场景分离以提高速度会让你受伤。

假设登录被测试为其中一项功能,在需要登录的其他情况下,您不必使用实际的登录表单。想一想programaticaly。

此外,您似乎正在使用Behat进行功能测试,同时它也用于验证业务预期。你可以考虑直接使用Mink,这会给你更多的力量。

答案 1 :(得分:1)

可以做到! 我刚刚找到了解决方案 - 您需要创建一个AbstractWebDriver类来维护webDriver的静态实例。

<强> FeatureContext

<?php
use Behat\Behat\Tester\Exception\PendingException;
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;

use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Behat\Hook\Scope\AfterScenarioScope;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;

/**
 * Defines application features from the specific context.
 */
class FeatureContext extends AbstractWebDriver
{
    /**
     * Initializes context.
     *
     * Every scenario gets its own context instance.
     * You can also pass arbitrary arguments to the
     * context constructor through behat.yml.
     */
    public function __construct()
    {
        $capabilities = DesiredCapabilities::safari();
        if(!AbstractWebDriver::$webDriver) {
            AbstractWebDriver::$webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities);
        }
        $this->baseUrl = "http://test.test.com";
    }
}

<强> AbstractWebDriver

<?php

use Behat\Behat\Tester\Exception\PendingException;
use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;

use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Behat\Hook\Scope\AfterScenarioScope;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;

/**
 * Defines application features from the specific context.
 */
abstract class AbstractWebDriver extends \PHPUnit\Framework\TestCase implements Context, SnippetAcceptingContext
{
    /**
     * @var \RemoteWebDriver
     */
    protected static $webDriver;
    protected $baseUrl;

protected function getDriver()
{
    if($this->webDriver==Null)
    echo "----------------- Instatiate New Driver -----------------";
    $capabilities = DesiredCapabilities::safari();
    self::$webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities);


    echo "----------------- Return Current Driver -----------------";
}



}

对于一个功能文件,我现在可以在webDriver的一个实例上运行多个场景!

答案 2 :(得分:0)

如果其中一个方案失败,该行为是什么?

&#34;通常&#34; (如果每个场景都有自己的会话),每个场景都会被执行,即使一个场景正在下降。 但现在,它会在一个下降之后停止每个场景吗?

即使你没有很多场景,但是必须纠正你的场景并重新启动你的场景可能很麻烦......一段时间后,你会有很多场景,你肯定会自动执行,想象一下如果1次测试失败,之后的所有其他测试都被阻止您将不得不重新执行所有操作以验证未执行的操作是否失败!

一切都可以在Php中完成,你只需要思考(根据问题或多或少)。但最大的问题是&#34; 后果是什么?&#34;。

如果开发者选择不这样做,那一定是个原因。所以要注意后面会追加什么。