1前書き

キュウリはBDD(Behavior Driven Development)テストフレームワークです。

フレームワークを使用して、入出力の順序を変えて繰り返しのシナリオを書くことは、非常に時間がかかり、保守が難しく、もちろんイライラすることがあります。

Cucumberは、

Scenario OutlineとExamples

の概念を使用してこの作業を減らすためのソリューションを提供しました。以下のセクションでは、例を取り上げ、この努力を最小限に抑える方法を説明します。

アプローチとGherkin言語についてもっと知りたいなら、リンクを見てください:/cucumber-rest-api-testing[この記事]


2キュウリのサポートを追加する

単純なMavenプロジェクトにCucumberのサポートを追加するには、以下の依存関係を追加する必要があります。

<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>1.2.5</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>1.2.5</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

Maven Centralからの依存関係への有用なリンク:


cucumber-junit

、https://search.maven.org/classic/#search%7Cga %7C1%7Ca%3A%22cucumber-java%22[cucumber-java]、https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22hamcrest-library%22[hamcrest-library]

これらはテスト用ライブラリなので、実際にデプロイ可能なものと一緒に出荷する必要はありません。そのため、すべてが

test

スコープになっています。


3簡単な例

注目のファイルを作成するための肥大化した方法と簡潔な方法の両方を説明しましょう。まず、テストを書きたいロジックを定義しましょう。

まず、テストを書きたいロジックを定義しましょう。

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}


4キュウリテストの定義


4.1. 機能ファイルの定義

Feature: Calculator
  As a user
  I want to use a calculator to add numbers
  So that I don't need to add myself

  Scenario: Add two numbers -2 & 3
    Given I have a calculator
    When I add -2 and 3
    Then the result should be 1

  Scenario: Add two numbers 10 & 15
    Given I have a calculator
    When I add 10 and 15
    Then the result should be 25

ここで見られるように、ここで加算論理をテストするために数の2つの異なる組み合わせが置かれました。数字を除けば、すべてのシナリオはまったく同じです。


4.2. 「接着剤」コード

これらのシナリオをテストするには、ステートメントを機能的なコードに変換するために、各ステップを対応するコードで定義することが不可欠です。

public class CalculatorRunSteps {

    private int total;

    private Calculator calculator;

    @Before
    private void init() {
        total = -999;
    }

    @Given("^I have a calculator$")
    public void initializeCalculator() throws Throwable {
        calculator = new Calculator();
    }

    @When("^I add (-?\\d+) and (-?\\d+)$")
    public void testAdd(int num1, int num2) throws Throwable {
        total = calculator.add(num1, num2);
    }

    @Then("^the result should be (-?\\d+)$")
    public void validateResult(int result) throws Throwable {
        Assert.assertThat(total, Matchers.equalTo(result));
    }
}


4.3. ランナークラス

機能とグルーコードを統合するために、JUnitランナーを使うことができます。

@RunWith(Cucumber.class)
@CucumberOptions(
  features = { "classpath:features/calculator.feature" },
  glue = {"com.baeldung.cucumber.calculator" })
public class CalculatorTest {}


5シナリオのアウトラインを使用してフィーチャを書き換える

4.1節で見ました。フィーチャファイルの定義は、どのようにして時間がかかり、エラーが発生しやすくなります。 __Scenario Outlineを使用すると、同じ機能ファイルをわずか数行に縮小できます。

Feature: Calculator
  As a user
  I want to use a calculator to add numbers
  So that I don't need to add myself

  Scenario Outline: Add two numbers <num1> & <num2>
    Given I have a calculator
    When I add <num1> and <num2>
    Then the result should be <total>

  Examples:
    | num1 | num2 | total |
    | -2 | 3 | 1 |
    | 10 | 15 | 25 |
    | 99 | -99 | 0 |
    | -1 | -10 | -11 |

通常の

Scenario Definition



Scenario Outline

を比較するときに、ステップ定義で値をハードコードする必要がなくなりました。ステップ定義自体では、値は

<パラメーター名>

としてパラメーターに置き換えられます。

シナリオ概要の最後に、

Examples

を使用して値をパイプ区切りの表形式で定義します。


Examples

を定義するためのサンプルを以下に示します。

Examples:
  | Parameter__Name1 | Parameter__Name2 |
  | Value-1 | Value-2 |
  | Value-X | Value-Y |


6. 結論

この簡単な記事では、シナリオを本質的に一般的なものにする方法を説明しました。また、これらのシナリオを書いて保守するための労力も削減します。

この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/testing[over on GitHub]にあります。