固有の検出範囲で分類するテストツールのマップ

ユニット

  • このレイヤーだけが検出できるもの: 誤ったロジック。ミリ秒単位で検出でき、失敗箇所も正確に分かります。

  • 存在する中で最も安価なフィードバックです。これを代替できるものはありません。

API

  • このレイヤーだけが検出できるもの: サービス境界での誤った挙動。どのインターフェースにも現れないケースを含みます。

  • ブラウザを動かすより高速で、より正確です。

エンドツーエンド

  • このレイヤーだけが検出できるもの: 個々の部品はすべて正常に動いているのに、組み上がった製品が機能しない状態。

  • 最も遅く、そしてユーザーの問いに答えられる唯一のレイヤーです。

これら3つのレイヤーの周囲には、3つの専門的なツールが位置します: コントラクトテスト は独立してデプロイされたサービス間の形式のずれを、 負荷テスト はキャパシティを、 セキュリティスキャン は既知の脆弱性の分類を、それぞれ検出します。いずれも主要な3つのレイヤーでは捉えられないものを検出しますが、どれもその代わりにはなりません。

空白が生まれやすいのはどこか

多くのチームはユニットテストとある程度のエンドツーエンドのカバレッジを持ち、その中間が薄くなっています。これは順序が逆です。APIレイヤーは、その上のレイヤーよりもはるかに低いコストで、ユーザーから見える欠陥の大半を検出するからです。

2つ目のよくある空白は、カバレッジがコード量に追いつかないことです。これは別のツールカテゴリを追加しても解決しません。解決するのは、誰かが書ける量に左右されないカバレッジです。

機能比較表よりも有効な問い

どのレイヤーのツールを検討している場合でも、失敗が修正する人の目にどう映るか、そしてアサーションに到達しないまま終わった実行が成功として報告されるかどうかを問うてください。この2点は、比較ページに載っているどの情報よりも、そのツールの価値をよく予測します。

すでに持っていて、使っていないツール

何かを追加する前に、すでに導入されたまま使われていないものを確認する価値があります。多くの組織は、実際に使っている以上のテスト能力をすでに持っているからです。

たいていは、2年前に書かれた数件のテストだけが残るユニットテストフレームワークがあります。毎晩実行されているのに誰も結果を見ないブラウザテストのスイートがあることも多くあります。通知をミュートしたチャンネルにレポートを送り続けるスキャナーがあることも珍しくありません。それぞれ理由があって導入され、理由があって使われなくなりました。同じカテゴリにもう一度お金をかける前に、その理由を知っておく価値があります。

よくある答えは、誰も対応しない出力は無視されるようになる、というものです。これはツールの問題ではなくプロセスの問題です。新しいツールは同じプロセスを引き継ぎ、同じ場所にたどり着きます。ただし、より遅く、より高いコストをかけて。

次の1時間をどこに使うか

  1. 壊れたら恥ずかしいと感じるフローを、エンドツーエンドでカバーします。

  2. その背後にあるAPIを、異常系のケースも含めてカバーします。

  3. 直近に壊れたものを、恒久的なチェックに変えます。

ターミナル

npm install -g @testsprite/testsprite-cli
testsprite setup

ローカルへのインストールを避けたい場合は、ダッシュボードが同じ範囲をカバーします。コマンドの全体像は CLIリポジトリにまとまっています。

  • GitHub App は、TestSpriteのダッシュボードで設定するWebhookです。パイプラインがすでに発行しているデプロイイベントを待ち受けるため、リポジトリ側には何の変更も必要ありません。

  • GitHub Actions を使えば、ターミナルから設定して、自社のワークフローの中にこのステップを組み込めます。

TestSpriteはこのマップのどこに位置するか

APIレイヤーとエンドツーエンドレイヤーです。ユーザーから見える欠陥の大半が存在し、かつよくある空白が生じるのが、この2つです。モックではなく実際に動作している製品に対して実行し、皆さんのソースと探索の実行結果からカバレッジを生成し、平易な言葉で調整できます。

Auto-Authenticationは実行全体を通してセッションを維持し、Dynamic Variablesは呼び出し間で値を引き渡し、Dependency Chainsは実行順序を導き出し、Auto-Cleanupはその実行が作成したものだけを正確に削除します。ブラウザ操作のステップはセレクタではなく意図として表現されるため、デザイン変更でスイートが赤くなることはありません。

ユニットテストは引き続き皆さんのものであり、最も安価なフィードバックであり続けます。コントラクトテスト、負荷テスト、セキュリティスキャンは、別個の手段のままです。利点は、リリース作業と競合するような記述の負担を増やすことなく、薄かった中間層が埋まることです。

テストツールはいくつ持つべきですか?

必要なレイヤーをカバーできる範囲で、できるだけ少なくすべきです。ツールが1つ増えるたびに、設定し、実行し、結果を解釈する対象が1つ増えます。

テストピラミッドは今も正しいのでしょうか?

その形は妥当な初期設定です。役に立つのは比率としてのピラミッドではなく、各レイヤーだけが何を検出できるのかを問うことです。

チーム間で標準化すべきですか?

レポーティングとCI連携については、そうすべきです。1つのツールをすべてのチームに強制すると、たいていは1つのチームだけがうまく使い、ほかのチームは避けるという結果になります。

最もよくある空白はどこですか?

薄いAPIレイヤーです。チームはユニットからエンドツーエンドへ一足飛びに進み、ユーザーから見える欠陥を最も安く検出できる層を飛ばしてしまいます。

そのツールが持ち続ける価値があるかは、どう判断すればよいですか?

そのツールが捉えた流出欠陥の数と、その出力を誰かが読んでいるかどうかです。誰も読まないツールは、ただのサブスクリプションです。

要点

カテゴリではなく、そのレイヤーだけが検出できるもので分類しましょう。

テストツールは、ほかでは検出できないものを各レイヤーがどれだけ捉えるかで整理する価値があります。よくある空白は薄いAPIレイヤーであり、どんな機能比較表よりも有効な問いは、失敗が修正する人の目にどう映るかです。