记录代码接收错误

IFI*_*SME 5 php selenium codeception

我对 Codeception 还很陌生,我遇到了一个我无法弄清楚的问题。我的测试套件中有大约 40 个测试,如果测试失败,我需要发送一封电子邮件,说明失败的原因。例如,如果 Codeception 在页面上找不到导致测试失败的元素,我需要发送一封仅包含错误的电子邮件,如下所示:

无法在 ThisClass::thisTest (/home/qauser/codeception_tests///acceptance-mobile/Wishlist/EmailWishlistCest.php) 中验证电子邮件愿望清单的行为是否符合预期,无法看到“成功!”,//*[@id ="wish-list-confirm-popup"]/div/div/div[1]/h4":

我不想发送完整的堆栈跟踪,只想发送实际的错误。有谁知道这是否可能?

Nat*_*ate 6

Codeception 公开了一个有用的事件集合,这些事件将在此用例中派上用场。有关更多信息,请查看 Codeception 文档的自定义:事件部分。

我建议拦截该页面上描述的两个事件:

  • test.fail事件中,大约每个失败的测试汇总信息。
  • test.fail.print当 Codeception 完成测试套件并将其自己的失败摘要打印到屏幕上时,该事件处理聚合数据(例如,通过发送摘要电子邮件)。

为此,您只需构建一个自定义事件处理程序类并将其注册为配置文件中的扩展:

# codeception.yml
extensions:
    enabled: [MyCustomEventHandler]

# MyCustomEventHandler.php
<?php
// Note: this was drafted using Codeception 2.0.  Some of the namespaces
// maybe different if you're using a more-recent version of Codeception.
class MyCustomEventHandler extends \Codeception\Platform\Extension
{
    /**
     * @var \Exception[]
     */
    protected $testFailures = [];

    /**
     * Maps Codeception events to method names in this class.
     *
     * Defining an event/method pair in this array essentially subscribes
     * the method as a listener for its corresponding event. 
     *
     * @var array
     */
    public static $events = [
        \Codeception\Events::TEST_FAIL       => 'singleTestJustFailed',
        \Codeception\Events::TEST_FAIL_PRINT => 'allTestFailuresAreBeingDisplayed',
    ];

    /**
     * This method will automatically be invoked by Codeception when a test fails.
     *
     * @param \Codeception\Event\FailEvent $event
     */
    public function singleTestJustFailed(\Codeception\Event\FailEvent $event)
    {
        // Here we build a list of all the failures. They'll be consumed further downstream.
        $this->testFailures[] = $event->getFail();
    }

    /**
     * This method will automatically be invoked by Codeception when it displays
     * a summary of all the test failures at the end of the test suite.
     */
    public function allTestFailuresAreBeingDisplayed()
    {
        // Build the email.
        $emailBody = '';
        foreach ($this->testFailures as $failure) {
            // Methods in scope include: $failure->getMessage(), $failure->getFile(), etc.
            $emailBody .= $failure->getMessage() . "\r\n";
        }

        // Now send the email!
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!