キュウリの春の統合

キュウリの春の統合

1. 概要

Cucumberは、Rubyプログラミング言語で記述された非常に強力なテストフレームワークであり、BDD(ビヘイビアドリブン開発)方法論に従います。 その目的は、開発者が非技術的な利害関係者が検証できる高レベルのユースケースをプレーンテキストで記述し、Gherkinと呼ばれる言語で記述された実行可能なテストに変換できるようにすることです。

これらについては、different articleですでに説明しました。

また、Cucumber-Spring Integrationは、テストの自動化を容易にすることを目的としています。 CucumberテストをSpringに統合したら、Mavenビルドとともに実行できるようになります。

2. Mavenの依存関係

Cucumber-JVM依存関係から始めて、Maven依存関係を定義することにより、Cucumber-Spring統合の使用を開始しましょう。


    info.cukes
    cucumber-java
    1.2.4
    test

Cucumber JVMの最新バージョンはhereにあります。

次に、JUnitとCucumberのテスト依存関係を追加します。


    info.cukes
    cucumber-junit
    1.2.4
    test

Cucumber JUnitの最新バージョンはhereにあります。

最後に、SpringとCucumberの依存関係:


    info.cukes
    cucumber-spring
    1.2.4
    test

Cucumber Springの最新バージョンはhereにあります。

3. 設定

次に、CucumberをSpringMicroサービスアプリケーションに統合する方法を見ていきます。 最初のステップは、Spring Bootアプリケーションを作成することです。このアプリケーションでは、Spring-Boot application articleを追跡します。

次に、ブートアプリケーションでSpring RESTサービスを作成し、このRESTサービスのCucumberテストを記述します。

3.1. RESTコントローラー

最初のステップとして、単純なREST APIのコントローラークラスを作成します。

@RestController
public class VersionController {
    @RequestMapping(method={RequestMethod.GET},value={"/version"})
    public String getVersion() {
        return "1.0";
    }
}

3.2. キュウリのステップの定義

JUnitランナーは、JUnitフレームワークを使用してCucumber Testを実行します。 必要なのは、アノテーション@RunWith(Cucumber.class)を使用して単一の空のクラスを作成することです。

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources")
public class CucumberTest {
}

フィーチャファイルとも呼ばれるGherkinファイルの場所を指定しているアノテーション@CucumberOptionsを確認できます。 この時点で、CucumberはGherkin言語を認識します。 Gherkinの詳細については、はじめに述べた記事をご覧ください。

それでは、Cucumber機能ファイルを作成しましょう。

Feature: the version can be retrieved
  Scenario: client makes call to GET /version
    When the client calls /version
    Then the client receives status code of 200
    And the client receives server version 1.0

そして、機能ファイルを見てみましょう。 シナリオは、RESTサービスのURL/versionに対してGET呼び出しを行い、応答をアサートすることです。

次のステップでは、このテストケースに対応するJavaクラスのメソッドを作成します。

@When("^the client calls /version$")
public void the_client_issues_GET_version() throws Throwable{
    executeGet("http://localhost:8080/version");
}

@Then("^the client receives status code of (\\d+)$")
public void the_client_receives_status_code_of(int statusCode) throws Throwable {
    HttpStatus currentStatusCode = latestResponse.getTheResponse().getStatusCode();
    assertThat("status code is incorrect : "+
    latestResponse.getBody(), currentStatusCode.value(), is(statusCode));
}

@And("^the client receives server version (.+)$")
public void the_client_receives_server_version_body(String version) throws Throwable {
    assertThat(latestResponse.getBody(), is(version));
}

したがって、MavenとSpringを使用してこれらのCucumberテストケースメソッドを実行する必要があります。 Mavenがこれらのテストクラスを実行できるように、Spring-JUnitで実行できるクラスを作成します。

@ContextConfiguration(
  classes = SpringDemoApplication.class,
  loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
@IntegrationTest
public class SpringIntegrationTest {

}

これで、すべてのCucumber定義は、上記のJavaクラスに拡張される個別のJavaクラスに入れることができます。

public class StepDefs extends SpringIntegrationTest {

    @When("^the client calls /version$")
    public void the_client_issues_GET_version() throws Throwable {
        executeGet("http://localhost:8080/version");
    }
}

これで、テストを実行する準備が整いました。

コマンドラインからクイック実行を実行できます。mvn clean install -Pintegration を実行するだけです。Mavenは統合テストを実行し、結果をコンソールに表示します。

3 Scenarios ([32m3 passed[0m)
9 Steps ([32m9 passed[0m)
0m1.054s

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9.283 sec - in
  com.example.CucumberTest
2016-07-30 06:28:20.142  INFO 732 --- [Thread-2] AnnotationConfigEmbeddedWebApplicationContext :
  Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext:
  startup date [Sat Jul 30 06:28:12 CDT 2016]; root of context hierarchy

Results :

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0

4. 結論

SpringでCucumberを構成したら、Springで構成されたコンポーネントをBDDテストで使用すると便利です。 これは、CucumberテストをSpring-Bootアプリケーションに統合するための簡単なガイドです。

この記事のコードに基づくサンプルプロジェクトは、linked GitHub repositoryにあります。