Drupal WebサイトのテストがBehatで簡単になりました(包括的なチュートリアル)
公開: 2020-09-08「良い話ほど強力なものは世界にありません」と、知恵と知恵の王であるティリオン・ラニスターは言いました。
ストーリーの力と優れたコミュニケーションにより、協調的で効率的なソフトウェア配信が可能になります。 アジャイル手法から進化したBehaviorDriven Development(BDD)テクノロジーは、この能力を最大限に活用してテストプロセスを自動化します。 Behatは、「ユビキタス言語」を使用した自動テストを可能にするそのようなBDDテクノロジーの1つです。 Behat、Mink、Gherkin、およびDrupalでそれを実装する方法について詳しく学びましょう。

Behatとは何ですか?
Behatは、Behavior Driven Development(BDD)を活用してテストを自動化するために使用されるオープンソースのPHPフレームワークです。 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”
}
•次に、ターミナルでcomposerinstallコマンドを実行します。
•完了すると、Behatファイルを含む新しいディレクトリbin /も表示されます。 これはBehat実行可能ファイルであり、これを使用してテストを実行し、デバッグ情報を取得します。
•次に、プロジェクトのルートフォルダー内にbehat.ymlという名前のファイルを作成します。 Behatを実行すると、構成に使用するbehat.ymlファイルが検索されます。
ディフォルト:
スイート:
ディフォルト:
コンテキスト:
--Drupal \ DrupalExtension \ Context \ DrupalContext
拡張機能:
Behat \ MinkExtension:
痛風:〜
base_url:http://example.org/#サイトのURLに置き換えます
Drupal \ DrupalExtension:
ブラックボックス:〜プロジェクトを初期化するには、次のコマンドを実行します。
ベンダー/ bin / behat –init
これにより、 features /フォルダーとbootstrap / FeatureContext.phpデフォルトコンテキストファイルがfeatures /フォルダー内に作成されます。
Behatでストーリーを書き、テストを実行する
私たちの目標は、最も効果的な方法でストーリーを説明することです。 ストーリーは、人間が読める言語であるGherkinで、拡張子が。で書かれています。 機能/ディレクトリの下に機能。
サイトの基本ページコンテンツタイプにコンテンツを正常に追加できるかどうかをテストする必要があると想像してみてください。 これを行うには、ページにアクセスしてフィールドに入力し、管理者として保存する必要があります。
それでは、最初のストーリーを書いてみましょう。
機能:基本ページCTを確認する ページを作成するには 管理者として / node / add / pageにアクセスしたい ページを作成できるように シナリオ:基本ページCT 「管理者」の役割を持つユーザーとしてログインしている場合 「/ node / add / page」に移動すると そして、「edit-title-0-value」に「Basicpagetitle」と入力します 「編集-送信」を押すと 次に、「基本ページ基本ページタイトルが作成されました」と表示されます。
このファイルには、 basic_page.featureという名前を付けることができます。 各機能には、機能の特定の動作を説明する多くのシナリオがあります。 各シナリオには次のセクションがあります。
•考える-システムの起動状態を詳細に
• When-ユーザーが実行するアクションが含まれます
•次に-アクションを実行した後にユーザーに表示される内容を説明します
•および-シナリオで接続を維持します。
Then、And、 Butの間に大きな違いはありません。 これらの単語は、シナリオを自然で読みやすくするために利用できるようになっています。

すべての機能ファイルは、 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はWebサイトのURLに対してcurlリクエストを実行します。これにより、テストプロセスが非常に高速になりますが、Javascriptを必要とする機能をテストする機能が失われます。 したがって、機能をテストするには、次のように、Javascriptを必要とするすべてのシナリオの前に@javascriptタグを追加するだけで済みます。 機能:基本ページCTを確認する ページを作成するには 管理者として / node / add / pageにアクセスしたい ページを作成できるように @api @javascript シナリオ:基本ページCT 私は、「管理者」の役割を持つユーザーとしてログインしています考えます 私は「/ノード/追加/ページ」に行くとき そして、「edit-title-0-value」に「Basicpagetitle」と入力します そして、フィールド「edit-body-0-value」に「Basicpagecontent」とwysiwygを入力します Iを押すと、「編集提出」 次に、 「基本ページ基本ページタイトルが作成されました」と表示されます。
これをテストするには、 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(){
}
/ **
*フィールドにwysiwygを入力します。
*
* @次に、フィールド:locatorに:valueを使用してwysiwygを入力します
* /
パブリック関数iFillInWysiwygOnFieldWith($ locator、$ value){
$ el = $ this-> getSession()-> getPage()-> findField($ locator);
if(empty($ el)){
throw new ExpectationException( 'ロケーターでWYSIWYGが見つかりませんでした:'。$ locator、$ this-> getSession());
}
$ fieldId = $ el-> getAttribute( 'id');
if(empty($ fieldId)){
throw new Exception( 'ロケーターのあるフィールドのIDが見つかりませんでした:'。$ locator);
}
$ this-> getSession()
-> executeScript( "CKEDITOR.instances [\" $ fieldId \ "]。setData(\" $ value \ ");");
}
}ここで、コマンドvendor / bin / behatを実行すると、記述されているすべてのシナリオに合格する必要があります。 定義されたJS関数は、シナリオステートメント「そして、wysiwygon-field「edit-body-0-value」に「 Basicpagecontent 」を入力します。
