キュウリの特徴: 概要

公開: 2022-04-20

はじめに

Gherkin は、多くのテスト自動化フレームワークで今でも使用されている言語です。 クライアントが私たちにそれを使用するように要求した場合もあれば、チームがそうすることにしたためである場合もあります.

正直、一目ぼれではありませんでした。 私は個人的に、Gherkin とかなり長い旅をしています。最初は好きでしたが、しばらく言語を嫌悪し、最終的には再び好きになりました。 この記事では、Cucumber の最も重要な機能と Java の実装を紹介します。

この記事で取り上げるすべての Cucumber 機能は次のとおりです。

特徴説明
シナリオシンプルなシナリオ
シナリオ概要ユーザーは「例」セクションでテスト データを提供する必要があります
データ テーブルユーザーはテスト ステップのテスト データを提供する必要があります
シナリオのコンテキストテスト ステップ間の値の共有
きゅうりのデータ型キュウリが扱うデータ型
きゅうりの正規表現キュウリのシナリオでの正規表現の使用
きゅうりのフックテスト シナリオで追加のコードを実行する
表 1. この記事で取り上げる Cucumber と Java の機能

機能ファイル

そもそもフィーチャーファイルとは? 技術の世界では、非技術者がアプリの開発中にチームと協力できるようにするための非技術的なアプローチが作成されました。 Gherkin 言語は、BDD アプローチの追加レイヤーとして作成されました。 Gherkin テストは、コード (Java、Kotlin、C# など) に接着されたいわゆる機能ファイルにあります。 通常、Gherkin は非常に使いやすく、最小限のプログラミング知識が必要ですが、コーディングが必要な機能もあります。

簡単なことから始めましょう。

シナリオ

Cucumber テストの最も基本的で使いやすい例を次に示します。

 特集:シナリオ

 背景: テスト シナリオの前に
   ステップの前に実行する場合

 @テスト
 シナリオ: シナリオ 
   「シナリオ 1」のパラメーター化されたステップを使用するとします。

コード ブロック 1. シナリオ

コード ブロック 1. には、説明すべきいくつかの事項が含まれています。

  • Feature : 機能ファイルのタイトル
  • Background : 機能ファイルで定義された各テスト シナリオの前にユーザーがテスト ステップを実行できるようにするキーワード
  • @Test : どのテスト シナリオを実行する必要があるかをテスト フレームワークに伝えるタグ。 「テスト」はユーザーが定義します。 たとえば、「@SmokeTest」を使用できます
  • Scenario : テストシナリオ名

Gherkin テストでは、各テスト ステップの前に [Given, When, Then, But] キーワードを使用します。 バックグラウンド ステップを除く唯一のテスト ステップでは、値「シナリオ 1」を渡すパラメーターを使用します。

それでは、接着された Java コードがどのように見えるかを見てみましょう。

 @Given("ステップの前に実行します")
public void iExecuteBeforeStep() {
   //何らかの実装
}

@Given("{string} のパラメーター化されたステップを使用します")
public void iUseParametrizedStepOf(String p) {
   //何らかの実装
}

コード ブロック 2. シナリオの Java コード実装

シナリオ概要

もっと複雑なことをしましょう:

 特集:シナリオ概要

 @テスト
 シナリオ概要:シナリオ概要
   「<parameter1>」と「<parameter2>」でステップを実行するとします。
 例:
     | | パラメータ 1 | パラメータ 2 |
     | | パラメータ1a | パラメータ2a |
     | | パラメータ1b | パラメータ2b |

コード ブロック 3. シナリオの概要

今回は、さまざまなテスト データ構成でテスト シナリオを繰り返すことができるシナリオ アウトラインを使用します。 コード ブロック 3. には、説明すべきことがいくつか含まれています。

  • : テスト シナリオで使用されるテスト データのマトリックス。 最初の行は、パラメーター名を含むヘッダーです。

そしてJava実装:

 @Given("{string} と {string} でステップを実行します")
public void iRunStepWithAnd(文字列 p1, 文字列 p2) {
   //何らかの実装
}

コード ブロック 4. シナリオ アウトラインの Java 実装

データ表

シナリオ アウトラインは非常に便利ですが、テスト シナリオ全体を繰り返すのではなく、1 つのテスト ステップだけを繰り返したい場合はどうすればよいでしょうか。 Gherkin にはそれを行う方法があり、「データ テーブル」と呼ばれます。

 機能: データ テーブル

@テスト
シナリオ: データ テーブルのシナリオ
 列に期待値が含まれていることを確認した場合
 | | 列名 | 期待値 |
 | | someColumnName | someExpectedValue |

コード ブロック 5. データ テーブル

データ テーブルを使用したシナリオは、シナリオ アウトラインとあまり変わりません。 唯一のことは、表の前に「Examples」キーワードを入れないことです。

Java の実装は、前のケースよりも少し複雑に見えます。

 @Given("列に期待値が含まれていることを確認します")
public void iVerifyColumnValuesInTableUsingQueryFromFileOnSchema(DataTable dataTable) {
   List<Map<String, String>> data = dataTable.asMaps();
   for (Map<String, String> form : data) {
       String columnName = form.get("columnName");
       String expectedResult = form.get("expectedValue");
       //何らかの実装
       }
   }
}

コード ブロック 6. データ テーブルの Java 実装

データ テーブルからデータにアクセスするには、「DataTable」タイプの特別な変数 dataTable を作成します。 すべてのデータは List 変数に格納されます。

シナリオのコンテキスト

シナリオ コンテキストを使用して、ステップ間でデータを共有できます。 ステップ 1 からステップ 2 に値「データ」を渡す 2 つのステップのシナリオがあるとします (コード ブロック 7)。

 @テスト
シナリオ: シナリオのコンテキスト
 シナリオ コンテキスト値「データ」を設定したとします。
 シナリオ コンテキスト値を使用するとします。

コード ブロック 7. シナリオのコンテキスト

まず、データの設定と取得のシナリオ コンテキスト機能を備えた ScenarioContext という特別なクラスを作成する必要があります (コード ブロック 8)。 シナリオ コンテキストは、キーと値のペアを持つ HashMap です。 キーで値を識別します。

  • scenarioContext() : キーと値のペアの HashMap
  • setContext() : シナリオ コンテキスト データを格納するためのキーと値のメソッド
  • getContext() : キーを提供するデータを取得するメソッド
 public class ScenarioContext {

   プライベート Map<String, Object> scenarioContext;

   パブリックシナリオコンテキスト(){
       scenarioContext = new HashMap<>();
   }

   public void setContext(コンテキストキー、オブジェクト値) {
       scenarioContext.put(key.toString(), 値);
   }

   public Object getContext(コンテキストキー){
       scenarioContext.get(key.toString()); を返します。
   }

}

公開列挙コンテキスト {
   ID;
}

Code Block 8. Scenario Context クラスの Java 実装

これがあれば、実装されたメソッドを利用できます。 ステップ 1 でシナリオ コンテキストに値を設定し、ステップ 2 で値を取得します (コード ブロック 9)。

 ScenarioContext scenarioContext = new ScenarioContext();

@Given("シナリオ コンテキスト値 {string} を設定しました")
public void iSetScenarioContextValue(文字列値) {
   scenarioContext.setContext(Context.ID, 値);
}

@Given("シナリオ コンテキスト値を使用します")
public void iUseScenarioContextValue() {
   String sharedValue = scenarioContext.getContext(Context.ID).toString();
}

コード ブロック 9. シナリオ コンテキストの手順

きゅうりのデータ型

Cucumber は限られた数のデータ型を処理します。 文字列、整数、および浮動小数点値を定義できますが、ブール値の場合は、いくつかの回避策をコーディングする必要があります。

 @テスト
シナリオ: 変数を使用したシナリオ
 文字列「string」、int 1、float 1.1、およびブール値「false」を使用するとします。

コード ブロック 10. キュウリのデータ型

Java コードは次のようになります。

 @Given("string {string}、int {int}、float {float}、boolean {string} を使用します")
public void iUseStringIntFloatAndBoolean(String var1, int var2, double var3, String var4) {
   boolean f = Boolean.valueOf(var4);
   //何らかのコード
}

コード ブロック 11. Cucumber データ型の Java 実装

きゅうりの正規表現

これは、よく使用されるもう 1 つの機能です。 コード ブロック 12 は、異なる変数値 (var1 と var2) を使用することのみが異なる 2 つのステップのシナリオを示しています。 これは実際には 1 つのステップにすぎません。Java コード (コード ブロック 13) では、1 つのメソッドのみを定義しますが、正規表現と 1 つのパラメーター var を使用します。

 @テスト
シナリオ: 正規表現のシナリオ
 変数 var1 を使用するとします。
 変数 var2 を使用するとします。

コード ブロック 12. Cucumber の正規表現

 @Given("^私は変数 (.*) を使用します")
public void ExamTimeTableInSummerSeason(String var) {
   if (var.equals("var1")){
       //何らかのコード
   }
   そうでなければif(var.equals("var2")){
       //何らかのコード
   }
}

コード ブロック 13. Cucumber 正規表現の Java 実装

きゅうりフック

最後になりましたが、きゅうりのフックです。

コード ブロック 14 は、最も重要な 4 つのフックを示しています。

  • @Before : 各テスト シナリオの前にコードを実行します。
  • @After : 各テスト シナリオの後にコードを実行します。
  • @BeforeStep : 各テスト ステップの前にコードを実行します
  • @AfterStep : 各テスト ステップの後にコードを実行します
 @前
public void beforeScenario() {
   //何らかのコード
}

@後
public void afterScenario() {
   //何らかのコード
}

@BeforeStep
public void beforeStep() {
   //何らかのコード
}

@アフターステップ
public void afterStep() {
   //何らかのコード
}

コード ブロック 14. キュウリ フック

概要

テストで Gherkin を使用するよう説得できたことを願っています。 これらのいくつかの機能により、テストが読みやすくなり、技術者以外の人でも理解しやすくなります。 また、新しい参加者は、ビジネス ロジックを理解しやすくなり、オンボーディングまでの時間が短縮されます。