APIテスティングツールに必要なのはテストケースごとのIDなのではないか #cicd_test_night

先日、機会をいただきましてCI/CD Test Night #7でAPIテスティングツール*1を開発している中で考えていることをお話しさせていただきました。

testnight.connpass.com

詳細はスライドをご覧ください。

speakerdeck.com

APIテストはスモールテストと比べて効果は大きいがコストも大きい

私はAPIテストの一番の課題はこれだと思っています。

APIテストは、「APIに対してリクエストを投げてそのままテストする」というわかりやすさがあります。

また、テストあたりにおけるカバレッジの広さというメリットもあります。

なので、できればデメリットであるコストの大きさをなんとかしたいわけです。

この課題の解決には2つの方法があります。

  1. コストを小さくする
  2. 範囲を広げて効果を大きくする

先に、範囲を広げる方法について考えると

  • 作ったテストをそのまま負荷テストに使えるように
  • 作ったテストをそのまま本番環境のリグレッションテストにも使えるように
  • APIテストしていたらAPIスキーマとの合致も検証するように

というような方向性、言ってみれば一石N鳥にすることによって効果を大きくするというものになります。効果が大きければコストが気にならなくなるだろうという寸法です。

では、コストを小さくするにはどのようにするかというと「テスト自体を書きやすくする(実装コストを小さくする)」などがあるのですが、結局は実行コストの大きさ、特に実行時間の長さが際立ってきてこれを解決しないといけなくなります。

まず最初に解決する手段として挙げられるのは「テストの並列実行」だと思います。

しかし、並列実行にも限界があります。

その次に取れる手段は何でしょう?

インテリジェントにテストを実行する

もう全てを愚直に実行するのはあきらめて、効率よく実行していく必要がありそうです。

「効率よく」というのは、例えば、

  • 失敗しやすいテストから先に実行する
  • 失敗しないテストは通常は実行しない
  • 実行時間が平均的になるように分けて並列実行する

などです。

ちなみに、このようなアプローチは私が考えたわけではありません。

私は、Launchable社の方たちの発表やエントリを見て知りました。

そして、APIテストという実行時間の長いテストに向き合うようになって、このアプローチの効果に期待しはじめるようになりました。

APIテスティングツールに必要なのはテストケースごとのIDなのではないか

そして、タイトル回収です。

先述した「インテリジェントなテスト実行」を実現するためにはまず何が必要か?というと、「テストケースの一意な識別」です。

それぞれのテストケースを一意に識別できなければ「どのテストが失敗したのか」がわかりません。 識別できなければ特定のテストだけを実行することもできないし、指定の順番に実行するということもできません。

テストケースに識別子=IDがあれば、特定テストの実行や、任意の順番でのテスト実行も可能になります。

インテリジェントなテストを実現するための第一歩が「ID」だと考えます。

APIテスティングツールに必要なのは(まず)テストケースごとのIDなのではないでしょうか*2

IDによる識別や、IDを使った柔軟なテストの実行ができることで、コストを抑えたインテリジェントなテスト実行への道が開けます。

ちなみに、runnにおけるIDの利用については次のエントリをご覧ください。

zenn.dev

この考えに至るまでの話

実は、きっかけはこのXのポストです。

ここからテスト実行時間について意識して考えるようになり、今に至っています。

今回の発表やこのエントリは @zoncoen さんのポストへの私なりの回答となります。

考えるきっかけをくれた @zoncoen さん、発表する機会をくれた @ponkio_o さんありがとうございました。

*1:ここでいう「API」とはWeb APIやgRPCを指します

*2:多くのテスティングツールにおいては備えているものでもあります。ただ、私が開発しているrunnには最初なかったのです。ちなみに提案してくださったのは同じrunn開発者の @katzchum さんです