使用 Behat 可以更轻松地测试您的 Drupal 网站(综合教程)

已发表: 2020-09-08

“世界上没有什么比好故事更强大的了”,智慧之王提利昂·兰尼斯特说。

故事的力量和良好的沟通使协作和高效的软件交付成为可能。 从敏捷方法发展而来,行为驱动开发 (BDD) 技术充分利用了这种能力来自动化测试过程。 Behat就是这样一种 BDD 技术,它支持使用“无处不在的语言”进行自动化测试。 让我们更多地了解 Behat、Mink、Gherkin 以及如何在 Drupal 中实现它。

behat drupal

什么是贝哈特?

Behat 是一个开源 PHP 框架,用于通过利用行为驱动开发 (BDD) 来自动化测试。 BDD 方法通过专注于持续沟通和简单的文本故事来确保高质量的软件交付。 使用 BDD,测试人员可以用人类可读的语言构建测试用例。 正因为如此,很容易让整个团队都在同一页面上,从产品所有者到开发人员,每个人都可以理解并获得有关当前场景的持续反馈。

什么是小黄瓜?

Behat 工具使用的语言是 Gherkin,这是一种业务可读且特定于领域的语言。 Gherkin 还可以用作活文档,并且可以生成报告来记录每次测试运行。 这种简单的基于空格的语言使用简单的语言词作为关键字。 缩进(使用空格/制表符)和行尾定义了测试用例的结构。 尽管编写和理解语言很容易,但最终结果应侧重于实现更好的协作、效率、自动化和可追溯性。 测试用例编写应直观,关注重要元素,避免检查重复记录并使用良好的语法。

什么是貂?

Mink 是一个开源浏览器控制器,它使用 Web 应用程序模拟测试场景。 一旦编写了测试用例,就需要执行它并模拟用户操作。 使用 Mink,您可以使用相同的测试场景并在各种浏览器模拟器(如 Goutte、Selenium、Chrome、Zombie 等)上运行它。 在安装 Behat Drupal 扩展时,您将看到对 Mink 的依赖,因此请确保您也安装了它。

在Drupal中安装和实现Behat

在 Drupal 项目中安装 Behat 的官方方法是通过 Composer。 它不仅可以为您安装 Behat,而且还可以在以后发布时轻松地将您更新到最新版本。

• 在项目文件夹中,运行以下命令:

 $ composer 需要 behat/behat

• 或者在您的 composer.json 文件中,添加 require 语句

“要求”: {
                "behat/behat": "^3.0.0",
     “phpunit/phpunit”:“^5.0.0”
     }

• 接下来,在终端中运行 composer install 命令。
• 完成后,您还会注意到一个新目录bin /,其中包含一个 Behat 文件。 这是 Behat 可执行文件,您将使用它来运行测试并获取调试信息。
• 接下来,在项目的根文件夹中创建一个名为behat.yml的文件。 当 Behat 运行时,它会查找用于其配置的behat.yml文件。

默认:
  套房:
    默认:
      上下文:
        - Drupal\DrupalExtension\Context\DrupalContext
  扩展:
    Behat\Mink 扩展:
      痛风:~
      base_url: http://example.org/ # 替换为您站点的 URL
    Drupal\Drupal 扩展:
      黑匣子:~

要初始化项目,请运行以下命令:

 供应商/bin/behat –init

这将创建一个功能/文件夹和功能/文件夹内的引导/ FeatureContext.php默认情况下的文件。

使用 Behat 编写故事和运行测试

我们的目标是以最有效的方式描述故事。 这些故事是用人类可读的语言 Gherkin 编写的,扩展名为 . 功能/目录下的功能

假设您需要测试是否可以成功地向站点中的基本页面内容类型添加内容。 为此,您必须有权访问该页面以填写字段并将其保存为管理员。

所以,让我们写我们的第一个故事:

 功能:检查基本页面CT
 为了创建一个页面
 作为管理员
 我想访问 /node/add/page
 这样我就可以创建一个页面

场景:基本页面 CT
 鉴于我以具有“管理员”角色的用户身份登录
 当我去“/node/add/page”
 我为“edit-title-0-value”输入“基本页面标题”
 当我按下“编辑-提交”时
 然后我应该看到“Basic page Basic page title has been created”

该文件可以命名为basic_page.feature 。 每个功能可以有许多场景,这些场景描述了功能的特定行为。 每个场景都会有部分:
Given - 详细说明系统的起始状态
何时- 包括用户采取的行动
然后- 描述用户在采取行动后看到的内容
- 保持场景中的连接。
Then、AndBut之间没有太大区别。 提供这些词是为了使您的场景自然而易读。

所有功能文件都可以通过vendor/bin/behat 运行。 如果要运行特定功能文件,请运行 vendor/bin/behat features/basic_page.feature。 还有一种方法可以通过添加一个定义场景的行号来运行单个场景: vendor/bin/behat features/basic_page.feature:11

有像 vendor/bin/behat -dl 这样的命令为您提供场景中使用的所有语句语法,而 vendor/bin/behat -di 提供语法和示例。

如何编写功能文件

Behat 针对您网站上的 URL 运行 curl 请求,这使得测试过程非常快,但也使 Behat 失去了测试需要 Javascript 的功能的能力。 因此,要测试功能,我们只需要在每个需要 Javascript 的场景之前添加 @javascript 标签,如下所示:

功能:检查基本页面CT
 为了创建一个页面
 作为管理员
 我想访问 /node/add/page
 这样我就可以创建一个页面

@api @javascript
场景:基本页面 CT
 鉴于我以具有“管理员”角色的用户身份登录
 我去“/node/add/page”
进入“基本页面标题”的“编辑-标题- 0值”
填写所见即所得现场“编辑车身0值”与“基本页面内容”
我按下“编辑-提交”时
 然后我应该看到“Basic page Basic page title has been created”


要对此进行测试,请运行vendor/bin/behat 。 这将显示场景中未定义的步骤,因为场景必须映射到函数。

贝哈特


您可以将代码片段复制粘贴到上下文文件FeatureContext.php或运行vendor/bin/behat --dry-run --append-snippets

然后你可以在 FeatureContext.php 中编写函数的定义,如下所示:

 <?php

使用 Behat\Mink\Exception\ExpectationException;
使用 Drupal\DrupalExtension\Context\RawDrupalContext;

/**
 * 从特定上下文定义应用程序功能。
 */
类 FeatureContext 扩展 RawDrupalContext {

  /**
   *貂皮上下文。
   *
   * @var Drupal\DrupalExtension\Context\MinkContext
   */
  受保护的 $minkContext;

  /**
   * 初始化上下文。
   *
   * 每个场景都有自己的上下文实例。
   * 您还可以将任意参数传递给
   * 通过 behat.yml 的上下文构造函数。
   */
  公共函数 __construct() {
  }

  /**
   * 在现场填写所见即所得。
   *
   * @然后我在字段 :locator 上填写所见即所得 :value
   */
  公共函数 iFillInWysiwygOnFieldWith($locator, $value) {
    $el = $this->getSession()->getPage()->findField($locator);
    如果(空($el)){
      throw new ExpectationException('Could not find WYSIWYG with locator: ' . $locator, $this->getSession());
    }
    $fieldId = $el->getAttribute('id');
    如果(空($fieldId)){
      throw new Exception('Could not find an id for field with locator: ' . $locator);
    }
    $this->getSession()
      ->executeScript("CKEDITOR.instances[\"$fieldId\"].setData(\"$value\");");
  }

}

现在,运行命令vendor/bin/behat ,写的所有场景都必须通过。 定义的 JS 函数将映射场景语句“并且我用“基本页面内容填写所见即所得的现场“edit-body-0-value ”。