http://behat.org/en/latest/user_guide/context/hooks.html
【hooking 钩子、点】
先了解行动树结构,看起来像这样:
├── Suite #1
│ ├── Feature #1
│ │ ├── Scenario #1
│ │ │ ├── Step #1
│ │ │ └── Step #2
│ │ └── Scenario #2
│ │ ├── Step #1
│ │ └── Step #2
│ └── Feature #2
│ └── Scenario #1
│ └── Step #1
└── Suite #2
└── Feature #1
└── Scenario #1
└── Step #1
一、钩子:
BeforeSuite #套件执行前,套件执行后才能执行 feature ,参数参考类 Behat\Testwork\Hook\Scope\BeforeSuiteScope
AfterSuite #套件执行完后,参数参考类 Behat\Testwork\Hook\Scope\AfterSuiteScope
BeforeFeature #feature 执行之前,参数参考类 Behat\Testwork\Hook\Scope\BeforeFeatureScope
AfterFeature #feature 执行完之后,参数参考类 Behat\Testwork\Hook\Scope\AfterFeatureScope
BeforeScenario #场景运行前将运行一个特定的场景,参数参考类 Behat\Testwork\Hook\Scope\BeforeScenarioScope
AfterScenario #运行Behat完成后执行一个场景,参数参考类 Behat\Testwork\Hook\Scope\AfterScenarioScope
BeforeStep #Step 运行之前运行,参数参考类 Behat\Testwork\Hook\Scope\BeforeStepScope
AfterStep #Setp 运行之后运行,参数参考类 Behat\Testwork\Hook\Scope\AfterStepScope
使用钩子:
您可以使用任何这些挂钩的注释你的方法在你的上下文类:
<?php
/**
* @BeforeSuite
*/
public static function prepare($scope)
{
// prepare system for test suite
// before it runs
}
简单地在注释里使用钩子标记(如:@BeforeSuite).
二、suite hooks [套件钩子]
套件钩运行场景的上下文之外。这意味着你的上下文类(如。 FeatureContext)
并且还没有实例化,所以Behat可以执行代码的唯一方法就是通过静态调用。这就是为什么套件钩必须被定义为静态方法:
<?php
use Behat\Testwork\Hook\Scope\BeforeSuiteScope;
use Behat\Testwork\Hook\Scope\AfterSuiteScope;
/** @BeforeSuite */
public static function setup(BeforeSuiteScope $scope)
{
}
/** @AfterSuite */
public static function teardown(AfterSuiteScope $scope)
{
}
套件钩子有两种类型:
@BeforeSuite——之前执行任何功能运行。
@AfterSuite——所有功能都运行后执行。
三、feature hooks
与套件钩子相同,功能钩子在场景上下文中运行。与套件钩子一样,您的功能钩子必须定义为您的上下文中的静态方法:
<?php
use Behat\Behat\Hook\Scope\BeforeFeatureScope;
use Behat\Behat\Hook\Scope\AfterFeatureScope;
/** @BeforeFeature */
public static function setupFeature(BeforeFeatureScope $scope)
{
}
/** @AfterFeature */
public static function teardownFeature(AfterFeatureScope $scope)
{
有两种功能挂钩类型可用:
@BeforeFeature - 在套件中的每个功能之前执行。
@AfterFeature - 在套件中的每个功能后执行。
四、scenario hooks [场景钩子]
在每个场景运行之前或之后触发场景钩。这些钩子在一个初始化的上下文实例中执行,因此它们不仅可以是简单的上下文实例方法,还可以访问您在场景中设置的任何对象属性:
<?php
use Behat\Behat\Hook\Scope\BeforeScenarioScope;
use Behat\Behat\Hook\Scope\AfterScenarioScope;
/** @BeforeScenario */
public function before(BeforeScenarioScope $scope)
{
}
/** @AfterScenario */
public function after(AfterScenarioScope $scope)
{
}
有两种情景钩子类型可用:
@BeforeScenario - 在每个功能的每个场景之前执行。
@AfterScenario - 在每个功能中的每个场景后执行。
现在,有趣的部分是:
该@BeforeScenario钩执行不仅在每个功能的每个场景之前,但在此之前每个例子排在 scenario outline (场景大纲)。每个 scenario outline (场景大纲)示例行与常规场景几乎相同。
@AfterScenario功能完全相同,在通常的情况和大纲示例之后执行。
五、step hooks [步骤钩子]
在每个步骤运行之前或之后触发步骤挂钩。这些钩子在一个初始化的上下文实例中运行,所以它们只是简单的上下文实例方法,方法与方法钩子相同:
<?php
use Behat\Behat\Hook\Scope\BeforeStepScope;
use Behat\Behat\Hook\Scope\AfterStepScope;
/** @BeforeStep */
public function beforeStep(BeforeStepScope $scope)
{
}
/** @AfterStep */
public function afterStep(AfterStepScope $scope)
{
}
?>
有两个步骤钩子类型可用:
@BeforeStep - 在每个方案的每个步骤之前执行。
@AfterStep - 在每个方案中的每个步骤后执行。
六、tagged hooks [标签钩子]
有时候可能希望某些钩子仅在某些场景,功能或步骤中运行。
这可以通过将@BeforeFeature, @AfterFeature,@BeforeScenario或@AfterScenario钩子与一个或多个标签相关联来实现。
还可以使用OR(,)和AND(&&)标签:
<?php
/**
* 逗号 “,” 表示“或”
* @BeforeScenario @database,@orm
*/
public function cleanDatabase()
{
// clean database before
// @database OR @orm scenarios [当场景有 database 或 orm 标签的时候执行]
}
/**
* “&” 表示 “且”
* @BeforeScenario @database&&@fixtures
*/
public function cleanDatabaseFixtures()
{
// clean database fixtures
// before @database @fixtures [场景必须有 database 和 fixtures 标签的时候执行]
// scenarios
}
?>
【.feature 文件使用 tagged 】
Feature: pystring
@database @fixtures
Scenario: pystring
Given a blog post named "Random" with:
"""
<h1>Some Title, Eh?</h1>
Here is the first paragraph of my blog post.
Lorem ipsum dolor sit amet, consectetur adipiscing
elit.
"""