单元测试-behat-2

原创 工具
阅读数: 973 2017年06月20日

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.

"""


&nbsp;


phpriji.cn | 网站地图 | 沪ICP备17015433号-1