Codeception 在 CEST 内的所有测试之前运行

Posted

技术标签:

【中文标题】Codeception 在 CEST 内的所有测试之前运行【英文标题】:Codeception run before all tests inside a CEST 【发布时间】:2016-08-21 13:34:51 【问题描述】:

我想在特定 Cest 中的所有测试之前运行一些东西,然后在所有测试运行后清理它,类似于 phpUnit 中的 setUpBeforeClass 和 tearDownAfterClass 方法。

有没有办法在 Codeception 中做这样的事情?

【问题讨论】:

【参考方案1】:

在 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 函数设为公共但不受保护,也不应以“_”开头,以便它在所有测试之前运行。

另一组函数在所有测试开始之前只运行一次,应该在 /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

【讨论】:

【参考方案2】:

从 Codeception 的角度来看,Cest 类只是一堆 Cept 场景。 没有对象范围,也没有前/后类挂钩。

我的建议是改用测试格式并使用 PhpUnit 挂钩。

测试格式扩展了 PHPUnit_Framework_TestCase,所以 setUpBeforeClass 应该可以工作。

【讨论】:

【参考方案3】:

您可以在functional.suite.yml 中附加新的助手:

class_name: FunctionalTester
modules:
    enabled:
      - tests\components\helpers\MyHelper

在 helper 中,您可以使用 _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 的必要性。

【讨论】:

我不确定我是否遵循。 _before 和 _after 不是在每个测试用例之前运行吗?如何使用这种方法区分 Cest? @Casteurr 你需要写一些代码。 TestCase 有一个 getTestFullName。这可能会有所帮助。 这似乎太复杂了。我需要这样的东西phpunit.de/manual/current/en/… 链接中的方法在 Codeception 单元测试中完美运行。省略第一行并使用类似这样的内容作为下一行:class YourClassTest extends \Codeception\Test\Unit【参考方案4】:

根据您所说的“运行某些东西”和“清理它”的含义,您可以使用 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
    

【讨论】:

以上是关于Codeception 在 CEST 内的所有测试之前运行的主要内容,如果未能解决你的问题,请参考以下文章

Codeception CEST 接受测试,如何在每次测试之前重新运行 __bootstrap 代码?

Codeception Cest 嘲弄

codeception - 模拟 api 调用数据

通过 Codeception 使用存在规则测试 Laravel 5 路由

Codeception,使用 pageObject 设计模式和 gherkin 编写验收测试

Codeception:生成验收测试在并行虚拟机上引发异常