CEST 内的所有测试之前的代码接收 运行
Codeception run before all tests inside a CEST
我想运行在一个特定的Cest里面的所有测试之前做一些事情,然后在所有测试都运行之后清理它,类似于PHPUnit中的setUpBeforeClass和tearDownAfterClass方法。
在 Codeception 中有这样的方法吗?
您可以在 functional.suite.yml
中附加新助手:
class_name: FunctionalTester
modules:
enabled:
- tests\components\helpers\MyHelper
在帮助程序中,您可以使用 _before
和 _after
方法:
class FixtureHelper extends \Codeception\Module
{
/**
* Method is called before test file run
*/
public function _before(\Codeception\TestCase $test)
{
// TODO: Change the autogenerated stub
}
/**
* Method is called after test file run
*/
public function _after(TestCase $test)
{
// TODO: Change the autogenerated stub
}
}
TestCase
方法可以帮助您确定执行 _before
和 _after
.
的必要性
从 Codeception 的角度来看,Cest class 只是一堆 Cept 场景。
没有对象作用域,也没有 before/after class 钩子。
我的建议是改用测试格式并使用 PhpUnit 挂钩。
测试格式扩展了 PHPUnit_Framework_TestCase,因此 setUpBeforeClass 应该可以工作。
这个问题我暂时有一个粗略的解决方案,在Codeception大佬给你靠谱的方法之前。
只需像这样在所有现有 actor(测试用例)之上创建另一个 Actor:
class MyCest
{
function _before(AcceptanceTester $I)
{
$I->amOnPage('/mypage.php');
}
public function _after(AcceptanceTester $I)
{
}
function beforeAllTests(AcceptanceTester $I,\Page\MyPage $myPage,\Helper\myHelper $helper){
//Do what you have to do here - runs only once before all below tests
//Do something with above arguments
}
public function myFirstTest(AcceptanceTester $I){
$I->see('Hello World');
}
function afterAllTests(){
//For something after all tests
}
}
您可以将函数 beforeAllTests 设为 public 但不受保护也不应以“_”开头,因为它在所有测试之前设为 运行。
另一组函数在所有测试开始之前只会 运行 一次,应该在 /tests/_support/Helper/Acceptance.php 中实例化以接受等等。在这里你可以调用函数:
// HOOK: used after configuration is loaded
public function _initialize()
{
}
// HOOK: before each suite
public function _beforeSuite($settings = array())
{
}
更多功能,请前往:https://codeception.com/docs/06-ModulesAndHelpers#Hooks
根据“运行 某些东西”和“清理它”的含义,您可以使用 PHP 标准构造函数和析构函数。
这个解决方案对我来说似乎更清楚,但请记住,您无法访问
AcceptanceTester $I
和 Scenario $scenario
,因此在不需要时使用它们。
class YourCest
{
private Faker\Generator $faker;
private string $email;
public function __construct()
{
// "Run something" here
$this->faker = Faker\Factory::create();
$this->email = $this->faker->email;
}
public function __destruct()
{
// "and then clean it up" there
}
public function tryToTest(AcceptanceTester $I)
{
// Do your tests here
}
}
我想运行在一个特定的Cest里面的所有测试之前做一些事情,然后在所有测试都运行之后清理它,类似于PHPUnit中的setUpBeforeClass和tearDownAfterClass方法。
在 Codeception 中有这样的方法吗?
您可以在 functional.suite.yml
中附加新助手:
class_name: FunctionalTester
modules:
enabled:
- tests\components\helpers\MyHelper
在帮助程序中,您可以使用 _before
和 _after
方法:
class FixtureHelper extends \Codeception\Module
{
/**
* Method is called before test file run
*/
public function _before(\Codeception\TestCase $test)
{
// TODO: Change the autogenerated stub
}
/**
* Method is called after test file run
*/
public function _after(TestCase $test)
{
// TODO: Change the autogenerated stub
}
}
TestCase
方法可以帮助您确定执行 _before
和 _after
.
从 Codeception 的角度来看,Cest class 只是一堆 Cept 场景。 没有对象作用域,也没有 before/after class 钩子。
我的建议是改用测试格式并使用 PhpUnit 挂钩。
测试格式扩展了 PHPUnit_Framework_TestCase,因此 setUpBeforeClass 应该可以工作。
这个问题我暂时有一个粗略的解决方案,在Codeception大佬给你靠谱的方法之前。
只需像这样在所有现有 actor(测试用例)之上创建另一个 Actor:
class MyCest
{
function _before(AcceptanceTester $I)
{
$I->amOnPage('/mypage.php');
}
public function _after(AcceptanceTester $I)
{
}
function beforeAllTests(AcceptanceTester $I,\Page\MyPage $myPage,\Helper\myHelper $helper){
//Do what you have to do here - runs only once before all below tests
//Do something with above arguments
}
public function myFirstTest(AcceptanceTester $I){
$I->see('Hello World');
}
function afterAllTests(){
//For something after all tests
}
}
您可以将函数 beforeAllTests 设为 public 但不受保护也不应以“_”开头,因为它在所有测试之前设为 运行。
另一组函数在所有测试开始之前只会 运行 一次,应该在 /tests/_support/Helper/Acceptance.php 中实例化以接受等等。在这里你可以调用函数:
// HOOK: used after configuration is loaded
public function _initialize()
{
}
// HOOK: before each suite
public function _beforeSuite($settings = array())
{
}
更多功能,请前往:https://codeception.com/docs/06-ModulesAndHelpers#Hooks
根据“运行 某些东西”和“清理它”的含义,您可以使用 PHP 标准构造函数和析构函数。
这个解决方案对我来说似乎更清楚,但请记住,您无法访问
AcceptanceTester $I
和 Scenario $scenario
,因此在不需要时使用它们。
class YourCest
{
private Faker\Generator $faker;
private string $email;
public function __construct()
{
// "Run something" here
$this->faker = Faker\Factory::create();
$this->email = $this->faker->email;
}
public function __destruct()
{
// "and then clean it up" there
}
public function tryToTest(AcceptanceTester $I)
{
// Do your tests here
}
}