きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

JavaでRESTが簡単にテストできるRest-Assuredを素振りしてみた

JavaでRESTが簡単にテストができるとされるRest-Assuredというライブラリを知ったので素振りしました。ですので、あまり深い話はこの記事ではしません。

なお、印象としてはSpringのMockMvcを使っているのであれば、わざわざ追加でRest-Assuredを導入はしないという印象でした。

環境

  • Java
    • 15
  • io.rest-assured
    • rest-assured
      • 4.3.3
    • spring-mock-mvc
      • 4.3.3
    • json-path
      • 4.3.3
    • xml-path
      • 4.3.3

説明

※公式より引用

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-pathjson-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に対してもテストできます。

次の例はGitHubAPIに対して、実行しているテストです。

  @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"));
    }
}

ソースコード

github.com

github.com

github.com

終わりに

普段使いしているSpringと併用するメリットが薄い、と感じた程度で、他の軽量フレームワークやE2Eテストをしたいとき等は有用なライブラリだと思います。2020-12-11にもリリースされているので、多くの人がまだまだメンテナンスしているライブラリなのでしょう。

今回はたまたまライブラリを見つけて素振りした程度ですけど、色々試していって有用な知識を身に着けていきたいです。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考

Rest-Assured公式 rest-assured.io

設定方法 github.com

f:id:nainaistar:20201013111905p:plain