Kotlin Springboot -- Part 12 Gauge で kluent と ScenarioDataStore を使ってレスポンスをシナリオごとにテストする
Tags: kotlin, guage, kluent, datastore
Published: 2022-10-09 14:17:24


## 何をしたいのか

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

---

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

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

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

```kotlin
import com.thoughtworks.gauge.Step
```

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

```kotlin
import java.net.URI
import java.net.http.HttpClient
import java.net.http.HttpRequest
import java.net.http.HttpResponse
```

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


---

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

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

```kotlin
    @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())
    }
```

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

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

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

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

```kotlin
        println(response.statusCode())
```

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

---

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

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

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

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

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

```kotlin
    @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())
    }
```

データストアは 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

```xml
<dependency>
    <groupId>org.amshove.kluent</groupId>
    <artifactId>kluent</artifactId>
    <version>{version}</version>
    <type>pom</type>
</dependency>
```

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yo5ihmsoslafor097vrx.png)

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

```xml
            <scope>test</scope>
```

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

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

```

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

```spec
* Persons一覧をリクエストする
* "200"が返る
```

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