JavaでRESTが簡単にテストができるとされるRest-Assuredというライブラリを知ったので素振りしました。ですので、あまり深い話はこの記事ではしません。
なお、印象としてはSpringのMockMvc
を使っているのであれば、わざわざ追加でRest-Assuredを導入はしないという印象でした。
環境
説明
※公式より引用
JavaでのRESTサービスのテストと検証は、RubyやGroovyなどの動的言語よりも困難です。REST Assuredは、これらの言語をJavaドメインに簡単に使用できるようにします。
使い方
build.gradleに依存関係を追加する
次の依存関係を追加します。
dependencies { testImplementation 'io.rest-assured:rest-assured:4.3.3' }
Springと一緒に使う場合
spring-mock-mvc
を使用する必要があります。また、responseのContentTypeによってはxml-path
とjson-path
も使用する必要があります。とりあえず、次の依存関係は全部インストールしておくといいでしょう。
dependencies { testImplementation 'io.rest-assured:spring-mock-mvc:4.3.3' testImplementation 'io.rest-assured:xml-path:4.3.3' testImplementation 'io.rest-assured:json-path:4.3.3' }
次のログはresponseがContentTypeがtext/plain
の場合、xml-path
を依存関係に含めていないときに発生するエラーです。
Expected response body to be verified as JSON, HTML or XML but content-type 'text/plain' is not supported out of the box. Try registering a custom parser using: RestAssured.registerParser("text/plain", <parser type>);
使い方
Gherkinみたいな記法でテストを書けます。
よくわかってませんが、この辺がJavaDSLなんですかね…。
ユニットテストをする場合
準備(Given)
standaloneSetup
でテスト対象のコントローラを読み込みます。
また、GETパラメータを指定できます。
実行(When)
URLとHTTPメソッドを指定すると実行します。
検証(Then)
実行後に期待するHttpStatusやBodyを指定します。
この時、Bodyの指定にはorg.hamcrest.Matchers
を指定します。正直、org.hamcrest.Matchers
ってJUnit 4の時に使っていたMatcherなので、個人的にはイマイチポイントです。JUnit 4の現場では使いやすいと思いますが…。
他のMatcherも指定できると思うのですが、その点に関しては調査不足です。
import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; @Test void test_01() { given() .standaloneSetup(new AnimalsRestController()) .param("piyo", "aiueo") .when() .get("/animals") .then() .statusCode(200) .body(equalTo("hogehoge")) ; }
E2Eのテストをする場合
起動しているAPIに対してもテストできます。
次の例はGitHubのAPIに対して、実行しているテストです。
@Test void test_01() { given() .when() .get("https://api.github.com/users/hirotoKirimaru") .then() .statusCode(200) .body("url", equalTo("https://api.github.com/users/hirotoKirimaru")) ; }
(参考)SpringのMockMvcを使う場合
Rest-Assuredと比較するため、SpringのMockMvcを使用してテストする場合をこちらに載せておきます。
検証するときにandExpect
という広い意味のメソッドになってしまいますので、Rest-Assuredを使ったほうがテストは見やすいです。
私はSpringでも十分テストの意図が伝わると考えていますので、Springを使っている場合はわざわざRest-Assuredを追加する必要はないかと考えています。
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(AnimalsRestController.class) class AnimalsRestControllerTests { @Autowired private MockMvc mockMvc; private final String rootUrl = "/animals"; @Test void success() throws Exception { this.mockMvc.perform(get(rootUrl).param("piyo", "aiueo")) .andExpect(status().isOk()) .andExpect(content().string("hogehoge")); } }
ソースコード
終わりに
普段使いしているSpringと併用するメリットが薄い、と感じた程度で、他の軽量フレームワークやE2Eテストをしたいとき等は有用なライブラリだと思います。2020-12-11にもリリースされているので、多くの人がまだまだメンテナンスしているライブラリなのでしょう。
今回はたまたまライブラリを見つけて素振りした程度ですけど、色々試していって有用な知識を身に着けていきたいです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考
Rest-Assured公式 rest-assured.io
設定方法 github.com