REST API 自動テストツールまとめ

REST API のテストを自動化するためのツールを調査した結果のまとめです。

前提として、無料で使用可能なツールのみを対象としています。

# 分類

一口に REST API のテスト自動化といっても、様々な種類のツールがあります。
今回は独自に分類した以下の 4 種類を順に紹介していきます。

* OpenAPI (Swagger) 連携系
* GUI 系
* CLI 系
* CDC testing 系

# OpenAPI (Swagger) 連携系

REST API の管理として OpenAPI (Swagger) で仕様を記述することは少なくないでしょう。
OpenAPI 連携系の API 自動テストツールでは、OpenAPI の仕様書をもとに自動テストが実施可能です。

## Dredd

* [GitHub - Dredd](https://github.com/apiaryio/dredd)
    * Star 3.2K

もともと API Blueprint のテストツールだったようですが、OpenAPI にも対応しています。
npm install のみでセットアップでき、導入は非常に簡単です。

OpenAPI 連携系のテストツール全般に言えることですが、レスポンスが定義したフォーマットに対応しているかをテストするのが中心的な用途になります。
なので、リクエスト時のパラメータを踏まえた適切なレスポンスが返ってきているか、リクエストパラメータを変えたらレスポンスが変わるのか、といったところまでテストしたい場合には相性は良くなさそうです。

参考

* [こんなに使える！今どきのAPIドキュメンテーションツール](https://www.slideshare.net/dcubeio/api-67703513)

## Swagger Test Templates

* [GitHub - Swagger Test Templates](https://github.com/apigee-127/swagger-test-templates)
    * Star 146

Swagger の API 仕様書をもとに自動テストを生成するツールです。

「[こんなに使える！今どきのAPIドキュメンテーションツール](https://www.slideshare.net/dcubeio/api-67703513)」というスライドによると、Dredd の方が使い勝手が良さそうです。

# GUI 系

GUI で API をテストするためのツールにも様々なものがあります。
GUI なので、CLI 系と比較してバージョン管理や CI との相性は劣ります。

## Postman

* [GitHub - Postman Inc.](https://github.com/postmanlabs)

GUI で API をテストするツールとしては、Postman がかなり使われているようです。

Postman で作成した設定を CLI で実行可能になる Newman や、OpenAPI の仕様書から Postman の設定を生成する swagger2-to-postman を組み合わせることで、CI に組み込むことも可能とのことです。

参考

* [swagger から postman の設定ファイルを作成し自動 API テストを行う](https://qiita.com/moaikids/items/1e05ef2595504689fe3e)

## Restlet Client

API テスト自動化が可能な Chrome 拡張です。

参考

* [Restlet Clientで始めるREST APIテストの自動化](https://qiita.com/84zume/items/fac99705c39d2f18ada7)

## Katalon Studio

Eclipse ベースの IDE で、Selenium のラッパのようです。

参考

* [Katalon Studioとはどんなソフトウェアか](https://qiita.com/kazurayam/items/aece5d314f84893a0a14)

# CLI 系

コマンドでテストを実行するタイプのツールです。
DSL や YAML の記述に抵抗がなければ、GUI 系よりもバージョン管理や CI 連携はしやすいです。

## Karate

* [GitHub - Karate](https://github.com/intuit/karate)
    * Star 2.6K

CLI での実行を前提とした API テストツールで最も有名なのではないかと思います。

ですが、少しだけさわってみたところ、以下の点がデメリットだと感じました。

* セットアップ時に Java 関係の設定が必要で手間がかかる
* 簡単ではあるものの、DSL を学ぶ必要がある

参考

* [人生がときめくAPIテスト自動化 with Karate](https://www.slideshare.net/takanorig/api-with-karate-146047857)
* [Karate vs REST-Assured: Comparing Powerful API Testing Frameworks](https://gorillalogic.com/blog/karate-vs-rest-assured-comparing-powerful-api-testing-frameworks/)

## Tavern

* [GitHub - Tavern](https://github.com/taverntesting/tavern)
    * Star 550

テストしたいリクエスト、レスポンスを YAML ファイルに記述して実行するだけの簡単なツールです。
pip install のみでセットアップでき、YAML も直感的に記述可能です。
「API 自動テストのための機能を最低限そろえた軽量なツール」という印象です。

参考

* [API Test ライブラリ Tavern のご紹介](https://user-first.ikyu.co.jp/entry/2019/05/07/110000)
* [yaml でテストが書ける Tavernというテストツールがすごい](https://qiita.com/flatfisher/items/d8377711a30af1e9856b)

## REST-Assured

* [GitHub - REST-Assured](https://github.com/rest-assured/rest-assured)
    - Star 4.4K

かなり有名なツールのようです。
「[Karate vs REST-Assured: Comparing Powerful API Testing Frameworks](https://gorillalogic.com/blog/karate-vs-rest-assured-comparing-powerful-api-testing-frameworks/)」に書かれているように、Java のナレッジがある程度必要な点がデメリットだと感じました。

参考

* [REST-Assured](http://rest-assured.io/)

# CDC testing 系

## Pact

* [GitHub - Pact Foundation](https://github.com/pact-foundation)

Consumer Driven Contract testing (CDC testing) のツールです。
特にマイクロサービスにおいて、クライアント (Consumer) 側とサーバ (Provider) 側のずれが発生しにくくなることを重視したツールです。

各種言語で提供されているフレームワークで API の仕様を記述することで、API のテストとモックを同時に生成できるようです。
リクエスト・レスポンスで JSON を扱うのであれば、JavaScirpt のフレームワーク (pact-js) を使うと相性が良さそうです。

開発フローにも影響を与えうるため導入コストは高そうですが、導入さえできれば非常に強力そうです。

参考

* [実践 Pact:マイクロサービス時代のテストツール](https://techlife.cookpad.com/entry/2016/06/28/164247)
* [PactでCDC testingを実行する](http://yamada.daiji.ro/blog/?p=1215)

# 結論

調査の結果、以下のような使いわけという結論に至りました。

## GUI を使いたい場合
* CI が不要な場合 ... Postman
* CI でも実行したい場合 ... Postman + Newman
* 別途 OpenAPI の仕様書を記述しており、フォーマットだけ簡易的にテストしたい場合 ... Postman +  Newman + swagger2-to-postman

## GUI が不要な場合
* 別途 OpenAPI の仕様書を記述しており、フォーマットだけ簡易的にテストしたい場合 ... Dredd
* リクエストのパラメータごとに適切なレスポンスが得られるかまで簡単にテストしたい場合 ... Tavern
* API のモックも用意し、開発フローも整備しつつ、がっつりテストしたい場合 ... Pact

## 個人的には ...

個人的には Pact が気になりつつも、導入コストが高そうなため、まずは Tavern あたりから試そうと思います。

# 2020/10/14 追記

仕事で Tavern をしばらく使ってみたところ、テストが落ちたときの原因が非常に見にくく、結局チーム内で API 自動テストツールを自作することになりました。
Tavern のようにディレクトリ内の YAML ファイルを再帰的に読み込んでテストを実行するようなツールは、チーム内で簡単に使う程度の最低限の機能であれば簡単に作れるので、サクッと自作してしまうのもいいかもしれません。

# 2022/12/15 追記

2022 年に、[Step CI](https://github.com/stepci/stepci) というツールが登場しました。
(最初のコミットが 2022/9/17 のようでした)

Tavern と同じように YAML ファイルでテストを記述して実行するツールで、まださわっていませんが、かなり良さそうな印象です。
REST 以外にも GraphQL や gRPC などにも対応しています。

個人的に次に API の自動テストツールを検討する機会では、Step CI を選ぶのも良さそうだなと思っています。

# 参考
- [OpenAPI.Tools - testing](https://openapi.tools/#testing)
- [Top 10 API Testing Tools in 2020 (Details & Updates Done for You!)](https://medium.com/@alicealdaine/top-10-api-testing-tools-rest-soap-services-5395cb03cfa9)
- [20 Best API Testing Tools in 2020: REST & SOAP Web Services](https://www.guru99.com/top-6-api-testing-tool.html)
- [10 Best API Testing Tools In 2020 (SOAP And REST API Testing Tools)](https://www.softwaretestinghelp.com/api-testing-tools/)
- [11 Best Tools to Test and Build API Faster](https://geekflare.com/api-tools/)
- [WebAPIテストフレームワーク選定](https://eldorado-of.info/wiki/programming/test/webapi%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF)