DEV Community

kaede
kaede

Posted on • Edited on

Kotlin Springboot -- Part 12 Gauge で kluent と ScenarioDataStore を使ってレスポンスをシナリオごとにテストする

何をしたいのか

作成したアプリの API を叩いて、レスポンスに期待する値が返ってくるかをテストしたい。


HTTP Request 用の Java ライブラリをインポートする

https://zetcode.com/kotlin/getpostrequest/

zetcode さんの kotlin での GET/POST HTTP リクエストの記事を参考にした。

import com.thoughtworks.gauge.Step
Enter fullscreen mode Exit fullscreen mode

デフォルトで thoughtworks の gauge の Step は import されている。

import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
Enter fullscreen mode Exit fullscreen mode

java.net から http のクライアント、リクエスト、レスポンス
これらのライブラリをインポートする


HTTP ライブラリを使ってレスポンスを取得する

この Java.net の HTTP ライブラリで HTTP リクエストをする Step を実装する。

    @Step("Persons一覧をリクエストする")
    fun requestPersons() {
        val client = HttpClient.newBuilder().build();
        val request = HttpRequest.newBuilder()
            .uri(URI.create("http://localhost:8080/persons"))
            .build();
        val response = client.send(request, HttpResponse.BodyHandlers.ofString());
        println(response.body())
    }
Enter fullscreen mode Exit fullscreen mode

Http クライアントのインスタンスを作成

Http リクエストのインスタンスを作成して、
URL を localhost8080 にする

Http クライアントのインスタンスの send を使って
いま組み立てたリクエストを送信して、レスポンス変数に入れる。

レスポンスのボディを出力する

        println(response.statusCode())
Enter fullscreen mode Exit fullscreen mode

これでレスポンスステータスコードも見れる。


レスポンスをシナリオデータストアに保存する

レスポンスはこれでみれた。
しかし、シナリオを分離するためには取ってきたレスポンスを保存して、それに対して個別に中身に何が有るか、アサーションをする必要が有る。

こういう場合、バックエンドではデータストアというものがある。
リフレッシュしても消えない保存場所で、フロントだとローカルストレージに当たるらしい。

https://www.javadoc.io/doc/com.thoughtworks.gauge/gauge-java/0.7.10/com/thoughtworks/gauge/datastore/ScenarioDataStore.html

gauge で扱えるのは、シナリオデータストアという。

    @Step("Persons一覧をリクエストする")
    fun requestPersons() {
        val client = HttpClient.newBuilder().build();
        val request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.google.com"))
            .build();
        val response = client.send(request, HttpResponse.BodyHandlers.ofString());
        ScenarioDataStore.put("StatusCode", response.statusCode())
    }
Enter fullscreen mode Exit fullscreen mode

データストアは key value で値を登録する。
なので、シナリオデータストアの put メソッドで
"StatusCode" という key でレスポンスのステータスコードを保存する。

https://webliker.info/web-skill/how-to-use-localstrage/

フロントのローカルストレージも同じように
localStorage.{set,get}Item で key value で使えるようだ。


kluent でリクエストから返ってきたレスポンスを期待値と比較する

https://github.com/MarkusAmshove/Kluent

shouldBeEqualTo などで自然言語っぽくテストの実装をするには
kluent が便利。

https://github.com/MarkusAmshove/Kluent#maven

<dependency>
    <groupId>org.amshove.kluent</groupId>
    <artifactId>kluent</artifactId>
    <version>{version}</version>
    <type>pom</type>
</dependency>
Enter fullscreen mode Exit fullscreen mode

公式で Maven での導入方法をみて、pom.xml に追記する。

Image description

version については、GitHub のリリースタブをみると 1.68 と書いてある。

            <scope>test</scope>
Enter fullscreen mode Exit fullscreen mode

scope が test だと記載することで、テストのプロジェクトでも使えるようになる。

    @Step("<statusCode>が返る")
    fun shouldBeStatusCode(statusCode: Int) {
        ScenarioDataStore.get("StatusCode") shouldBeEqualTo statusCode
    }

Enter fullscreen mode Exit fullscreen mode

ScenarioDataStore の get で、
先程作った "StatusCode" の key から取り出し
引数の期待値とする statusCode と比較する。

* Persons一覧をリクエストする
* "200"が返る
Enter fullscreen mode Exit fullscreen mode

すると、このように別の行でテストできる。

Top comments (0)