使用 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 ”。