ちゃんゆーのブログ

思ったことや、技術系のメモなどを書き残していきます。

Symmetric API Testing という、手間なく堅牢に外部 API Client をテストする手法

もともと息抜きに社内向けに書いた記事ですが、外部向けにリライトしました。久々にはてなブログにポストしてみます。

さて、自分の仕事柄 API Client を実装する機会が多いのですが、改めて良い API Client ってどういうものなんだろうかと探っていました。

GolangでAPI Clientを実装する | Taichi Nakashima という記事が、 Golang に限らない汎用的な API Client の設計と実装についてわかりやすく述べられていてよかったです。

deeeet.com

その記事の終わりに、 API Client のテスト手法として Symmetric API Testing が紹介されていて、大変興味深かったので記事としてまとめてみました。

Symmetric API Testing とは?

Symmetric API Testing という手法はこちらの記事で言及されていました。

blog.gopheracademy.com

Anaconda という GolangTwitter API Client の課題を解決するために採用した API Client のテスト手法とのことでした。

めちゃくちゃ要約すると以下のような内容でした。

  • API Client のテスト手法はいくつかあるがどれもつらい
    • 実際に API にリクエストを投げる手法
      • API のレート制限によりテスト結果が不安定になる
      • クレデンシャル情報の管理に手間がかかる
      • 遅い
    • モックサーバーを用意してリクエストを投げる手法
      • モックサーバーを構築するのに手間がかかる
      • API のリファレンスが完全である保証はなく、モックサーバーが誤ったレスポンスを返す可能性がある
      • API の仕様変更にモックサーバーが対応する手間がかかる
  • Symmetric API Testing は実際のリクエストとレスポンスを自動で保存しておいて、テスト実行時に保存したデータを参照する手法
    • 上記のつらみをうまく解消している
      • 実際にリクエストを投げるのは最初の1回のみ
      • テストはローカルで完結するので早い
      • モックサーバーを立てる手間が不要となる
      • API のドキュメントの不備や仕様変更があっても、レスポンスを保存し直せばよいだけ
    • 少ない手間で堅牢なコードを作成できてとてもいいぞ

Symmetric というのは、リクエストとレスポンスを保存しておくことで、モックサーバーとモッククライアントを対照的にテストできるというところからきているようですね。

とてもよさそう。

どうやって Symmetric API Testing をやっていくか

Symmetric API Testing 自体は Golang 界隈で2015年頃に盛り上がった手法のようですが、 Golang に限らず似たような手法は試されており、手軽に実現するライブラリもいくつかあるようでした。

Symmetric API Testing | Gopher Academy Blog では、直接 Golang の io 周りの API でゴリッとファイル書き出しする方法が取り上げられています。

Ruby では vcr というライブラリがあり、 VCR.py など各言語に派生したライブラリが多数存在しています。 みなさんお使いの言語でも手軽に試せるかもしれません。

github.com

ライブラリなくとも、JSONYAML などでファイル書き出してテスト実行時に読み出せばよいだけなので、自前でもやりやすくはありますね。

まとめ

ふとしたきっかけで Symmetric API Testing について調べてみましたが、 API Client のテストのつらーいところをうまく解消した、斬新で面白いテスト手法でした。

自分は普段 Python 使うことが多いだけあるので VCR.py を触ってみたのですが、非常に使用感よかったです。

また追って体験記事も書いていきたいと思います。

2022-12-20 追記

その後 Python で Symmetric API Testing を試した話を書きました。

chanyou.hatenablog.jp