genesis/behat-fail-aid

通过在测试失败时与您协作,从测试套件中获得更多。截图和更多。与Goutte和MinkExtension兼容。

3.7.5 2023-05-04 10:11 UTC

README

简介

一次又一次,我们都看到了修复 behat 测试的难度和压力。这个包旨在帮助收集所有可能的失败信息,并在出现失败时将其打印出来,无需进行基本调查,即可最小化设置。

常见的失败 Before

使用 fail-aid 上下文 After

启用配置选项 More info

链接已准备好点击并在浏览器中打开。无需麻烦!

激活后,您还将免费获得以下步骤定义

And I take a screenshot
And I gather facts for the current state

这些将在屏幕上输出相关信息。(您的格式必须很漂亮才能正常工作 --format=pretty)。

新增功能

主要:重构、受控输出、场景调试 CLI、清除截图 CLI、主机机器截图 URL。

次要

  • 解决 hostUrl 和 hostDirectory 选项的环境变量。
  • 仅在请求输出时执行截图代码。
  • 通过单独上下文文件参数覆盖输出参数。
  • 覆盖更多输出参数。
  • 将 output.api 参数设置为 true,以将所有与 Mink 相关的标志/操作设置为 false,以便快速设置。

补丁:无。

安装

composer require genesis/behat-fail-aid --dev

CLI

清除截图

如果提供 --clear-screenshots 标志,则将从指定的目录中删除现有的截图。

场景调试

如果提供 --scenario-debug 标志,则将在每个步骤之后尝试截图并在控制台显示,以帮助调试。与自动清理功能结合使用时最佳。

失败时等待

可以使用 --wait-on-failure={seconds} 选项在浏览器中调查/检查失败。

失败反馈

可以使用 --feedback-on-failure 标志在发生失败时立即打印失败。当使用进度格式化程序(例如在长时间运行的测试套件中,如 CI)时非常有用。

配置/用法

#behat.yml
default:
  suites:
    default:
      contexts:
        - FailAid\Context\FailureContext
  extensions:
    FailAid\Extension: ~

这是基本设置,将为您提供有关失败的很多信息。有关更多选项,请阅读其余的 README。以下任何选项都可以彼此结合使用。

输出选项

您可以通过配置文件控制辅助文本的详细程度。默认情况下,所有选项都启用。

default:
  extensions:
    FailAid\Extension:
      output:
        api: false # (Set this to true if testing against API's which don't use mink).
        url: false
        status: false
        tags: false
        feature: false
        context: false
        screenshot: false
        driver: false
        rerun: false
        debugBarSelectors: false

这些参数可以在 behat.yml 中每个 FailureContext 声明中覆盖

#behat.yml
default:
  suites:
    web:
      contexts:
        - FailAid\Context\FailureContext
    API:
      contexts:
        - FailAid\Context\FailureContext:
          - output:
            screenshot: false
  extensions:
    FailAid\Extension:
      output:
        screenshot: true

截图选项

#behat.yml
...
    FailAid\Extension:
      screenshot:
        directory: /temp/failures/behat/screenshots/
        mode: default
        autoClean: false
        size: 1444x1280
        hostDirectory: /tmp/$USER/failures/
        hostUrl: http://ci/failures/$BRANCH_NAME/$JOB_NUMBER/failures/

目录(字符串)

覆盖默认截图路径。默认文件夹由 sys_get_temp_dir() 函数提供。可以是相对路径。

模式(字符串)

默认:在支持的情况下,驱动程序将生成 png,否则生成 html。

html:所有驱动程序都将生成 html 截图,这对于查询运行时代码很有用。

png:所有驱动程序都将生成 png 截图,或者尝试失败。

autoClean(布尔值)

在测试套件运行之前清理目录。

大小(字符串)

在失败时拍摄的截图大小。目前不重置窗口大小。可能与 maximiseWindow API 冲突。

hostDirectory(字符串)

如果针对 VM 或容器运行,可以将此路径设置为宿主机的截图目录。截图将保持不变,输出将针对您的宿主机。解析环境变量。

HostUrl(字符串)

如果在远程环境中运行,失败可能可在 URL 上找到。解析环境变量。

siteFilters选项

#behat.yml
...
    FailAid\Extension:
      siteFilters:
        '/images/': 'http://dev.environment/images/'
        '/js/': 'http://dev.environment/js/'

应用于HTML截图的内容。当处理资产的相对URL时非常有用。

跟踪JavaScript错误/日志

当发生失败时,您可以轻松跟踪页面上的JavaScript活动。将以下代码片段放在您应用的头部部分(确保它是全局的)

<script type="text/javascript">
  window.jsErrors = []; window.jsWarns = []; window.jsLogs = [];
  window.onerror = function(error, url, line) {
      window.jsErrors.push('[Uncaught error]: ' + error + '; Line: ' + line);
  };

  if (!console) var console = {};
  var _privateError = console.error;
  console.error = function() {
    window.jsErrors.push('[Console error]: ' + JSON.stringify(arguments)); _privateError.apply(console, arguments);
  }

  var _privateWarn = console.warn;
  console.warn = function() {
    window.jsWarns.push('[Console warn]: ' + JSON.stringify(arguments)); _privateWarn.apply(console, arguments);
  }

  var _privateLog = console.log;
  console.log = function() {
    window.jsLogs.push('[Console log]: ' + JSON.stringify(arguments)); _privateLog.apply(console, arguments);
  }
</script>

您原始的调试消息仍然会出现在您的控制台。

#behat.yml
...
    FailAid\Extension:
      defaultSession: chrome # If you've got multiple sessions registered. If its a standard setup you won't need this.
      trackJs:
        errors: true
        warns: true
        logs: true
        trim: 1000

当启用错误时,任何预期的console.error调用和js异常都将被记录并显示为失败的一部分。将对消息进行裁剪以缩短到指定的长度。

debugBarSelectors选项

#behat.yml
...
    FailAid\Extension:
      debugBarSelectors: #Only CSS selectors allowed.
        'Status Code': '#debugBar .statusCode'
        'Error Message': '#debugBar .errorMessage'
        'Queries Executed': '#debugBar .executedQueries'
        xhrRequests:
          callback: MyXhrRequestsInfoExtractor::extract

上述代码将遍历每个选择器并查找元素。如果找到元素,它将显示失败输出中包含的文本。在拍摄页面截图后,收集调试栏详细信息,所以如果您需要,可以安全地导航到另一个页面。如果您必须这样做,请参阅“高级集成”部分以获取更多信息。

defaultSession选项

当您使用多个会话时,您可以使用fail aid扩展仅配置使用特定会话。

...
    FailAid\Extension:
      defaultSession: mySession
...

记录状态

您可以为失败记录您的测试状态。状态在每个场景之前重置。

# FeatureContext.php
<?php

use FailAid\Context\FailureContext;

class FeatureContext
{
    /**
     * @Given I am logged in
     */
    public function login()
    {
        $email = $this->createUserWithRandomEmail(); // assume this returns [email protected]
        $this->fillField('email', $email);
        $this->fillField('password', 'xxxxxxxx');
        $this->press('login');

        FailureContext::addState('test user', $email);
    }
}

当上述步骤定义在任何场景中使用时,它将记录测试用户电子邮件地址,位于当前场景的状态中。如果场景失败,您将在失败消息中获取存储在状态中的任何信息。

...
[STATE]
  [TEST USER] [email protected]
...

常见调试问题

调试栏干扰测试是很常见的情况,即在进行启用JS的行为测试时,“您的点击将接收另一个元素”。在这种情况下,我建议不要关闭调试栏,而是执行代码来隐藏它。在调试方面,尽可能收集信息对于快速修复至关重要。我建议在访问调用后放置您的hideDebugBar()代码。这可以简单到在栏上单击隐藏按钮。

高级集成

有时您的逻辑会更复杂,传递选项可能不适合您。在这种情况下,建议查看FailureContext以了解它允许您覆盖的内容。您可以使用自己的上下文类扩展FailureContext,并覆盖认为必要的部分。您必须将您自己的类在behat.yml上下文部分注册。

要注册所有套件而无需单独配置,或只需在代码中执行

# FeatureContext.php
<?php

use Behat\Testwork\Hook\Scope\BeforeSuiteScope;
use FailAid\Context\FailureContext;

class FeatureContext
{
    /**
     * @BeforeSuite
     */
    public static function loadFailureContext(BeforeSuiteScope $scope)
    {
        $params = [
            'screenshot' => [
              'directory' => null,
              'mode' => FailureContext::SCREENSHOT_MODE_DEFAULT,
              'autoClean' => false,
            ],
            'siteFilters' => [],
            'debugBarSelectors' => [],
            'defaultSession' => 'mySession',
        ];

        $scope->getEnvironment()->registerContextClass(
            FailureContext::class,
            $params
        );
    }
}