チームは、テストがどのように編成されているかという問題を解決するかのように「自動化を使用している」とよく言います。しかし、そうではありません。2つのテストスイートは両方とも自動化されていても、完全に異なる方法で構成されており、維持にかかるコストも全く異なります。構造がフレームワークであり、選択するフレームワークタイプによって、テストの成長速度、非プログラマーの貢献のしやすさ、小さなUI変更がコード全体に波及する度合いが決まります。
この記事では、リニア、モジュラー、データ駆動型、キーワード駆動型、ハイブリッド、ビヘイビア駆動型という6つの古典的な自動テストフレームワークタイプについて説明します。それぞれの内容、得意な点、苦手な点を解説し、前任のエンジニアが設定したものを引き継ぐのではなく、チームに合った構造を選択できるようにします。これらの概念は、UI、API、単体テストすべてに適用されます。
自動テストフレームワークとは
自動テストフレームワークとは、自動テストの記述、編成、実行方法を定義する一連のガイドライン、慣例、再利用可能なコンポーネントのことです。これはインストールするツールではありません。テストが存在するアーキテクチャそのものです。
フレームワークは、誰かがテストを記述する前に構造的な疑問に答えます。テストデータはどこに保存されるのか?再利用可能なステップはどのように共有されるのか?誰が貢献できるのか、コーダーだけか、アナリストもか?結果はどのように報告されるのか?異なるフレームワークタイプはこれらの疑問に異なる方法で答えます。それがタイプを分けるものです。この広い概念に慣れていない方は、下記のタイプ分けの前に自動テストとは何かの概要が役立つ背景知識を提供します。
これが重要な理由はメンテナンスです。最初の100個の自動テストを記述するのは簡単です。アプリケーションが毎週変更される中で1000個のテストを維持するのは困難であり、そのメンテナンスコストに最も大きく影響するのがフレームワークタイプです。
具体的な例を考えてみましょう。ログイン画面のフィールドラベルが変わりました。あるテストスイートでは、その変更によって2つのテストが壊れ、修正に10分かかります。全く同じアプリケーションをテストする別のスイートでは、200のテストが壊れ、修正に2日かかります。アプリケーションは同じです。フレームワークの構造だけが異なります。このギャップこそが、コードを記述した後ではなく、記述する前にフレームワークタイプについて考える価値がある理由のすべてです。
6つのフレームワークタイプ
1. リニア(記録・再生)
リニアフレームワークは、ユーザーのアクションを記録し、それをスクリプトとして再生します。各テストは、共有関数やデータとロジックの分離がない、一連の平坦なステップです。ツールがスクリプトを生成するため、導入の障壁はほとんどありません。
小さなプロジェクト、クイックデモ、または一度限りのスモークテストでのスピードが魅力です。しかし、コストはすぐに現れます。何も再利用されないため、同じログインステップがすべてのテストにコピー&ペーストされます。ログインページが変更されると、50個のスクリプトを編集することになります。リニアフレームワークは拡張性がなく、ほとんどのチームは数週間以内にこれでは対応できなくなります。
2. モジュラー
モジュラーフレームワークは、アプリケーションを小さく独立したモジュールに分割し、それぞれのモジュールに対して再利用可能な関数を記述します。テストはこれらの関数の組み合わせになります。例えば、ログイン、検索、カートに追加、チェックアウトなどです。ログイン画面が変更された場合、1つの関数を修正するだけで、すべてのテストがその恩恵を受けます。
これは真にスケーラブルな最初の構造です。トレードオフは初期設計にあります。テストを迅速に流せるようにするには、誰かがモジュールの境界を決定し、抽象化レイヤーを構築する必要があります。ほとんどのエンジニアリングチームにとって、モジュラーは賢明なデフォルトであり、自動テストスクリプトの書き方に関するガイドで説明されている規律と相性が良いです。
3. データ駆動型
データ駆動型フレームワークは、テストロジックとテストデータを分離します。1つのテスト関数が、CSVファイル、JSONファイル、スプレッドシート、またはデータベースに保存された入力の行に対して複数回実行されます。カバレッジはコードを記述するのではなく、行を追加することで増大します。
このタイプは、同じワークフローを数十種類の入力の組み合わせ(有効なログイン、無効なログイン、境界値、地域差など)で検証する必要がある場合に最適です。特にAPIの場合、CSVおよびJSONを使用したデータ駆動型APIテストは、1つのリクエストを数百のケースに変換します。トレードオフは、テストロジック自体が固定されていることです。データ駆動型構造は入力は拡張しますが、振る舞いは拡張しません。
4. キーワード駆動型
キーワード駆動型フレームワークは、アクションをLogin、SearchProduct、VerifyTotalなどの名前付きキーワードに抽象化します。テストはキーワードと引数の表として記述され、多くの場合スプレッドシートに記述されるため、プログラマーでなくてもコードに触れることなくテストを組み立てることができます。
強みはアクセシビリティです。QAアナリストやビジネススタッフがテストを直接作成し、読むことができます。コストはキーワードライブラリです。エンジニアはすべてのキーワードの背後にある実装を構築し、維持する必要があります。設計が不十分なキーワードセットは、それ自体がメンテナンスの負担になります。キーワード駆動型構造は、テストの作成とテストの整備が異なる役割間で分かれているチームに適しています。
5. ハイブリッド
ハイブリッドフレームワークは、上記の2つ以上を組み合わせたもので、最も一般的なのは、モジュラーな再利用にデータ駆動型の入力、さらにキーワードの抽象化を加えたものです。これは明確なタイプというよりも、実際のプロジェクトでは異なる場所で異なる構造が必要であるという実用的な認識です。
ほとんどの成熟したテストスイートは、数千のテストに達する頃にはハイブリッドになっています。リスクは一貫性のなさです。組み合わせが意図的に設計されていない場合、すべてのタイプのメンテナンスコストを抱え、どのタイプの明確さも得られません。ハイブリッドフレームワークは、組み合わせが意図的で文書化されている場合に機能します。
6. ビヘイビア駆動型 (BDD)
ビヘイビア駆動型フレームワークは、Given-When-Thenパターンを使用して、テストをほぼ自然言語で表現します。通常、Gherkinで記述され、Cucumberのようなツールによって実行されます。シナリオは文章のように読めます。例:「登録済みのユーザーが、有効な認証情報を送信したとき、ダッシュボードに到達する。」
BDDの価値は共通理解です。製品、QA、エンジニアリングが同じ仕様を読むことで、要求されたものと構築されたものの間のギャップが減少します。コストは2つのレイヤーです。読みやすいGherkinと、それを実装するステップ定義です。製品スタッフが実際にシナリオを読まない場合、BDDのメリットを得ることなく、そのコストを支払っていることになります。BDD APIテストのためのGherkinガイドでは、このパターンがAPIに適用される様子を示しています。
フレームワークタイプの比較
| フレームワークタイプ | 再利用性 | 非プログラマーによる作成 | セットアップコスト | 拡張性 |
|---|---|---|---|---|
| リニア | なし | はい、記録経由 | 非常に低い | 低い |
| モジュラー | 高い | いいえ | 中程度 | 高い |
| データ駆動型 | 中程度 | 部分的 | 中程度 | 入力に対して高い |
| キーワード駆動型 | 高い | はい | 高い | 高い |
| ハイブリッド | 高い | 場合による | 高い | 非常に高い |
| BDD | 高い | はい、読み書きが可能 | 高い | 高い |
この表はパターンを明確に示しています。セットアップコストが安いほどスケーラビリティは悪くなる傾向があり、非プログラマーを含む構造は舞台裏でより多くのエンジニアリング投資が必要です。無料の選択肢はなく、制約に合った選択肢があるだけです。
よくあるフレームワークの間違い
賢明なタイプを選んだチームでさえ、実際にはそれを台無しにしてしまうことがあります。3つの間違いが何度も現れます。
1つ目は、時期尚早な抽象化です。チームは、テストが15個しかないスイートに対して、キーワード駆動型またはハイブリッド構造を採用します。抽象化レイヤーは、それが提供するテストよりも構築と維持にコストがかかります。構造は規模に従うべきです。実際の重複が次の再利用レイヤーを正当化するようにしましょう。
2つ目は、その逆です。進化を拒否すること。20個のテストで機能したリニアスイートが、400個になってもリニアのままで、アプリケーションの変更があるたびに、コピー&ペーストされたスクリプトの苦痛な修正が引き起こされます。リニアのままにするコストは静かに蓄積され、たった1つの小さな変更が1日を台無しにすることになります。1つの製品変更のために多くのテストを編集しているというシグナルに注意し、苦痛が日常的になる前にモジュラー型にリファクタリングしましょう。
3つ目は、対象としないオーディエンスのためにタイプを選択することです。BDDは、非エンジニアが実際にGherkinを読む場合にのみ効果を発揮します。キーワード駆動型は、アナリストが実際にテストを作成する場合にのみ効果を発揮します。もしこれらの人々がスイートに全く触れない場合、追加レイヤーのコストを負担するだけで、そのメリットは得られません。理論上ではなく、実際に参加する人々に合わせてタイプを選択しましょう。
フレームワークタイプの選び方
流行に流されず、チームとプロジェクトに合わせて選びましょう。
- 規模と寿命。使い捨てのスクリプトはリニアで構いません。四半期以上保守されるものは、最低でもモジュラーであるべきです。
- 誰がテストを記述するか。すべてのエンジニアが記述する場合は、モジュラーまたはハイブリッドが適しています。役割が混在する場合は、キーワード駆動型またはBDDが適しています。
- 入力の多様性。安定したワークフローに対して多くの入力の組み合わせがある場合は、データ駆動型が適しています。
- コミュニケーションギャップ。製品とエンジニアリングの間で頻繁な誤解がある場合は、共有仕様が主要な利点であるBDDが適しています。
- 既存のスキル。最適なフレームワークタイプは、チームが実際に保守できるものです。誰も理解できない洗練された構造は、誰もが理解できる単純な構造よりも早く失敗します。
ほとんどのチームはハイブリッドに行き着きます。モジュラーな再利用を基盤とし、多様なケースにはデータ駆動型の入力を、コラボレーションが最も重要な場所にはBDDを適用します。シンプルに始め、理論ではなく、実際の課題が追加の構造を正当化するようにしましょう。フレームワークタイプ以外のテスト戦略については、テストシナリオとテストケースのガイドにある区別が、各テストがカバーすべき範囲を定めるのに役立ちます。
プラットフォームが役立つ点
フレームワークタイプの選択はアーキテクチャの決定です。それを適切に実行するには、適切なツールが必要です。特にAPIテストでは、Apidogは、共有されたパラメーター化されたリクエストによるモジュラーな再利用、CSVおよびJSONファイルからのデータ駆動型実行、そして非プログラマーがテストを組み立てられるビジュアルテストビルダーをサポートしており、これは手動で構築されたキーワードライブラリなしでキーワード駆動型構造の精神を実現しています。
これは重要です。なぜなら、フレームワークタイプは、チームが一貫してそれに従う能力があって初めて良いものだからです。構造を組み込んだプラットフォームは、スイートが成長し、人が参加したり離れたりしてもテストの一貫性を保ちます。Apidogをダウンロードして、これらのパターンが実際にどのように機能するかを確認し、どれだけのカスタムフレームワークコードがまだ必要かを判断できます。正直なところ、期待よりも少ないことが多いでしょう。なぜなら、Apidogは、手動で構築するフレームワークが再実装しなければならないリクエスト、データ、レポートの各レイヤーをすでに処理しているからです。
よくある質問
自動化ツールと自動テストフレームワークの違いは何ですか?
ツールはブラウザドライバーやHTTPクライアントのようにテストを実行します。フレームワークはそれらのツールの周囲にある構造です。テストの編成、ロジックの共有、データの供給、結果の報告に関する慣例のことです。フレームワークなしでツールを使用することはできますが、テストの保守は困難になります。フレームワークこそが自動化を継続可能にするものです。
最適な自動テストフレームワークタイプは何ですか?
普遍的に最適なものはありません。リニアは使い捨てのスクリプトに適し、モジュラーはほとんどのエンジニアリングチームに適し、データ駆動型は入力の多様性が高い場合に適し、キーワード駆動型とBDDは混合スキルのチームに適し、ハイブリッドは大規模で成熟したスイートに適しています。最も人気のあるオプションを選ぶのではなく、チームのスキルとプロジェクトの寿命に合わせてタイプを選択してください。
BDDはAPIのみ、またはUIテストのみに限定されますか?
どちらでもありません。BDDは構造パターンであり、レイヤーではありません。Given-When-Then形式は、単体テスト、APIテスト、UIテストすべてに適用できます。その真の要件はテストレイヤーではなく、オーディエンスです。BDDは、非エンジニアが実際にシナリオを読んだり書いたりする場合にのみ効果を発揮します。
スイートを構築した後でフレームワークタイプを切り替えることはできますか?
はい、可能ですが、スイートの規模に比例した労力が必要です。リニアからモジュラーに移行するには、コピー&ペーストされたスクリプトから再利用可能な関数を抽出する必要があります。この教訓は、数千のテストにフレームワークタイプを後付けするよりも、適切な構造で始める方がはるかに簡単なので、早期に拡張可能な構造を選ぶことです。
小規模プロジェクトでもフレームワークは必要ですか?
本当に短期間で終わるプロジェクトであれば、真のフレームワークなしでリニアな記録済みスクリプトで運用できます。しかし、「小規模」プロジェクトは成長する傾向があります。スイートが数週間以上継続するか、複数の人が関わる場合は、軽量なモジュラー構造であってもすぐにその価値を発揮します。
