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)