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 $IScenario $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
    }
}