1. 概要

この記事では、ZeroCode自動テストフレームワークを紹介します。 REST APIテストの例を通じて、基本を学びます。

2. アプローチ

ZeroCodeフレームワークは、次のアプローチを採用しています。

  • 多面的なテストのサポート
  • 宣言型のテスト

両方について話し合いましょう。

2.1. 多面的なテストのサポート

このフレームワークは、アプリケーションの複数の側面の自動テストをサポートするように設計されています。 とりわけ、それは私たちにテストする能力を与えます:

  • 休み
  • 石鹸
  • 安全
  • 負荷/ストレス
  • データベース
  • Apache Kafka
  • GraphQL
  • オープンAPI仕様

テストは、フレームワークのDSLを介して行われます。これについては後で説明します。

2.2. 宣言型

ZeroCodeは宣言型のテストを使用します。つまり、実際のテストコードを記述する必要はありません。 JSON / YAMLファイルでシナリオを宣言すると、フレームワークはそれらを舞台裏でテストコードに「変換」します。 これにより、をテストする方法ではなく、テストしたいものに集中することができます

3. 設定

pom.xmlファイルにMaven依存関係を追加しましょう。

 <dependency>
      <groupId>org.jsmart</groupId>
      <artifactId>zerocode-tdd</artifactId>
      <version>1.3.27</version>
      <scope>test</scope>
 </dependency>

最新バージョンは、MavenCentralを利用できます。 Gradleも使用できます。 IntelliJを使用している場合は、 JetbrainsMarketplaceからZeroCodeプラグインをダウンロードできます。

4. RESTAPIテスト

上で述べたように、ZeroCodeはアプリケーションの複数の部分のテストをサポートできます。 この記事では、RESTAPIテストに焦点を当てます。 そのため、小さなSpring Boot Webアプリを作成し、単一のエンドポイントを公開します。

@PostMapping
public ResponseEntity create(@RequestBody User user) {
    if (!StringUtils.hasText(user.getFirstName())) {
        return new ResponseEntity("firstName can't be empty!", HttpStatus.BAD_REQUEST);
    }
    if (!StringUtils.hasText(user.getLastName())) {
        return new ResponseEntity("lastName can't be empty!", HttpStatus.BAD_REQUEST);
    }
    user.setId(UUID.randomUUID().toString());
    users.add(user);
    return new ResponseEntity(user, HttpStatus.CREATED);
}

コントローラで参照されているUserクラスを見てみましょう。

public class User {
    private String id;
    private String firstName;
    private String lastName;

    // standard getters and setters
}

ユーザーを作成するときは、一意のIDを設定し、Userオブジェクト全体をクライアントに返します。 エンドポイントは、 / api /usersパスで到達可能です。 物事をシンプルに保つために、ユーザーをメモリに保存します。

5. シナリオを書く

シナリオは、ZeroCodeで中心的な役割を果たします。 これは、1つ以上のステップで構成されており、実際にテストしたいものです。 ユーザー作成の成功パスをテストする単一のステップでシナリオを書いてみましょう。

{
  "scenarioName": "test user creation endpoint",
  "steps": [
    {
      "name": "test_successful_creation",
      "url": "/api/users",
      "method": "POST",
      "request": {
        "body": {
          "firstName": "John",
          "lastName": "Doe"
        }
      },
      "verify": {
        "status": 201,
        "body": {
          "id": "$NOT.NULL",
          "firstName": "John",
          "lastName": "Doe"
        }
      }
    }
  ]
}

各プロパティが何を表すかを説明しましょう。

  • scenarioName –これはシナリオの名前です。 任意の名前を使用できます
  • steps –JSONオブジェクトの配列。テストする対象を記述します。
    • name –ステップに付ける名前
    • url –エンドポイントの相対URL。 絶対URLを入力することもできますが、一般的にはお勧めできません
    • method –HTTPメソッド
    • request –HTTPリクエスト
      • body –HTTPリクエストの本文
    • verify –ここでは、サーバーが返した応答を検証/アサートします
      • status –HTTP応答ステータスコード
      • body (verifyプロパティ内)–HTTP応答本文

このステップでは、ユーザーの作成が成功したかどうかを確認します。 サーバーが返すfirstNamelastNameの値を確認します。 また、ZeroCodeのアサーショントークンを使用して、IDがnullではないことを確認します。

通常、シナリオには複数のステップがあります。 シナリオのsteps配列内に別のステップを追加しましょう。

{
  "name": "test_firstname_validation",
  "url": "/api/users",
  "method": "POST",
  "request": {
    "body": {
      "firstName": "",
      "lastName": "Doe"
    }
  },
  "verify": {
    "status": 400,
    "rawBody": "firstName can't be empty!"
  }
}

このステップでは、空の名を指定します。これにより、不正なリクエストが発生する可能性があります。 ここでは、応答本文はJSON形式ではないため、rawbodyプロパティを使用してプレーン文字列として参照します。

ZeroCodeはシナリオを直接実行できません。そのためには、対応するテストケースが必要です。

6. テストケースを書く

シナリオを実行するために、対応するテストケースを作成しましょう。

@RunWith(ZeroCodeUnitRunner.class)
@TargetEnv("rest_api.properties")
public class UserEndpointIT {

    @Test
    @Scenario("rest/user_create_test.json")
    public void test_user_creation_endpoint() {
    }
}

ここでは、メソッドを宣言し、JUnit4の@Testアノテーションを使用してテストとしてマークします。 負荷テストにのみ、ZeroCodeでJUnit5を使用できます。

また、ZeroCodeフレームワークに由来する@Scenarioアノテーションを使用してシナリオの場所を指定します。 メソッド本体は空です。 すでに述べたように、実際のテストコードは記述していません。 テストしたいことは、シナリオで説明されています。 テストケースメソッドでシナリオを参照するだけです。 UserEndpointITクラスには2つの注釈があります。

  • @RunWith –ここでは、シナリオの実行を担当するZeroCodeクラスを指定します
  • @TargetEnv –これは、シナリオの実行時に使用されるプロパティファイルを指します

上記のurlプロパティを宣言したときに、相対パスを指定しました。 明らかに、ZeroCodeフレームワークには絶対パスが必要なので、テストの実行方法を定義するいくつかのプロパティを使用してrest_api.propertiesファイルを作成します。

  • web.application.endpoint.host –RESTAPIのホスト。 この場合、 http://localhostです。
  • web.application.endpoint.port –RESTAPIが公開されているアプリケーションサーバーのポート。 私たちの場合、8080です
  • web.application.endpoint.context –APIのコンテキスト。 私たちの場合、それは空です

プロパティファイルで宣言するプロパティは、実行しているテストの種類によって異なります。 たとえば、 Kafka のプロデューサー/コンシューマーをテストする場合は、さまざまなプロパティがあります。

7. テストの実行

シナリオ、プロパティファイル、およびテストケースを作成しました。 これで、テストを実行する準備が整いました。 ZeroCodeは統合テストツールであるため、Mavenのフェイルセーフプラグインを活用できます。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.0.0-M5</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>3.0.0-M5</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

テストを実行するには、次のコマンドを使用できます。

mvn verify -Dskip.it=false

ZeroCodeは、 $ {project.basedir} /targetフォルダーにチェックアウトできる複数のタイプのログを作成します。

8. 結論

この記事では、ZeroCode自動テストフレームワークについて説明しました。 フレームワークがRESTAPIテストの例でどのように機能するかを示しました。 また、ZeroCode DSLを使用すると、実際のテストコードを作成する必要がなくなることもわかりました。

いつものように、記事のソースコードはGitHubから入手できます。