4

我在这方面做了很多研发,但我无法找到解决方案。

我需要在单个功能文件中维护不同场景之间的登录会话。我做了一个函数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 分钟。我想要的是在单个功能文件中的每个场景之后,测试继续使用相同的登录会话。

4

3 回答 3

4

It can't be done. Behat scenarios are independent on purpose. Otherwise, you would risk state leaking from one scenario to another.

You're not approaching the problem from the right direction. Sacrificing scenario separation for speed improvements will hurt you in the long run.

Assuming that logging in is tested as one of the features, in other scenario where logging in is required, you don't have to be using the actual login form. Think of doing it programaticaly.

Also, you seem to be using Behat for functional testing, while it's build for verifying business expectations. You could consider using Mink directly, which would give you more power.

于 2013-10-10T09:58:48.500 回答
1

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

特征上下文

<?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";
    }
}

抽象网络驱动程序

<?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 实例上运行多个场景!

于 2018-04-04T22:57:14.937 回答
0

如果其中一个场景失败,这是什么行为?

“正常”(如果每个场景都有自己的会话),每个场景都会被执行,甚至一个正在下降。但是现在,它会在一个下降之后停止每个场景?

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

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

如果开发人员选择不这样做,那一定是有原因的。所以要注意后面会附加什么。

于 2018-04-27T09:33:09.177 回答