APIテストは効果的、なのになぜみんなやらないの?

マイクロサービスおよびAPI駆動型アーキテクチャへの移行は、あらゆる業界に大きな革新をもたらしていますが、企業を見えにくいリスクにさらしてもいます。ヒューマンインターフェイス(Web UIやモバイルUI)は、もはや主要なビジネスリスクが存在するエリアではありません。代わって、APIの非ヒューマンインターフェイスに最大の脆弱性が隠されています。

このため、APIテストはますます重要視されていますが、 相変わらず「API テストとはいったい何か、なぜ必要なのか」という声が聞かれます。 

アプリケーションプログラミングインターフェイス(API)とは、簡単に言えば、定義されたコントラクトによって管理される共通のインターフェイスを使用してアプリケーションが互いに通信する方法です。APIテストの導入が進む背景には、UIから独立した安定した方法でアプリケーションのビジネスロジックをテストできることがあります。 APIテストでは、フロントエンドだけでテストするよりも包括的なテスト、たとえばパフォーマンステストやセキュリティテストが可能になります。業界アナリストやMartin FowlerやMike Cohnなどのアジャイルの専門家は、APIテストが最善の道であることに同意しています。それなのに、何が私たちを引きとめているのでしょうか?

非効果的なテストの影響

ソフトウェア開発チームは、プロジェクトを最大限に効率的に成功させるため、テストやデバッグにちょうど適切なだけの時間を費やしたいと考えています。しかし従来、テストやデバッグにかかる​​時間を短縮することは困難でした。なぜなら、リリース後も含め、ソフトウェアライフサイクルの後半に深刻なバグやセキュリティ上の脆弱性が多数発見されているからです。

下の図は、アプリケーションに欠陥が入り込んだ時期と、欠陥を修復する時期によってコストがどのように変わるかを示しています。明確に見て取れるように、後半で欠陥を修正するコストは膨大です。このようにコストが増加する要因としては、問題を診断し、根本的な原因を特定するのにかかる時間、プロセスに関与する人の数、欠陥の修復の複雑さ(したがってリスク)が増加することが挙げられます。

「これは見覚えがある」と思われたとすれば……おそらくそのとおりでしょう。Capers Jonesがこのグラフの元となった研究を発表したのは1996年です。以来、20年以上にわたるソフトウェア開発プラクティスの変化を経ても、その後の研究によって、今日でもまだこの結果は妥当であることが確認されています。

目標:テストピラミッド

いったい、何が間違っているのでしょうか?それは、品質に対するアプローチが間違っているのです。上のグラフを見て、欠陥の検出をシフトレフトし、診断が容易で修復しやすい早期に問題を発見する方法を模索する必要があります。深いコード解析のようなテクニックは、コードに入り込んだセキュリティや信頼性の問題を、コードが書かれたときすぐに発見することができますが、実行時の動作や機能的動作を検証するためには、自動テストの作成と保守に時間を費やす必要があります。アジャイルの世界では、テストを作成したら、それを継続的に実行し、新しい機能が実装されると同時にレグレッションを検出できるよう、問題の検出を「シフトレフト」する必要があります。

時間とテスト内訳の理想的な配分は、下に示す「テストピラミッド」として表現されることがよくあります。これは、開発タイムラインの可能な限り早期に可能な限りテスト作業を進めるというものです。発見されたバグの修正コストが低いユニットテストを基礎として、APIテスト、コンポーネントテスト、統合テスト、システムおよびUIテストというようにピラミッドを積み上げていきます。

しかし、テスト駆動型開発(TDD)、 早い段階でのユニットテスト 、ソフトウェアテストの自動化などのプラクティスが主流になりつつある今も、ソフトウェアチームは、サイクル後半でのUIテストやシステムテストにまだ多くの時間を費やしています。私たちはこれまで何度も、現状を表現するのに逆ピラミッド(アイスクリームコーン)という言葉を使ってきました。しかし、データを詳しく見てみると、APIテストがほとんど行われていないことがわかりました。したがって、マティーニグラスと表現するのがより適切でしょう。

テストピラミッドの中間層であるAPIテストが一般的に活用されていないのは残念です。APIテストに投資することには明確な利点があるからです。たとえば、APIテストはソフトウェア開発ライフサイクルの早い段階で(APIのコントラクト/定義が利用可能になるとすぐに)行うことができますし、自動化が容易で、アプリケーションのUI / UXの変化にも影響を受けにくいのです。

APIテストを組み合わせて一般的なユースケースを再現することで、シナリオレベルのテストを作成することもできますし、APIテストの自動化により、早い段階でシナリオ駆動のパフォーマンスとセキュリティテストを可能にする道が開かれます。最終的には、APIテストへの投資により、チームはより良く変更を管理し、最新の開発手法が約束するアジリティを実現できます。早期に頻繁にテストする、まったくいいことずくめです。 けれど残念ながら、チームはさまざまな理由でAPIテストを実装するのに苦労しています。

APIテストの障害

APIテストの採用を妨げている最大の障害は、実際にどうテストを作成するかという点です。APIレベルで機能する意味のあるテストを作成するだけでも容易ではありません。さらに、それらを組み合わせて適切なテストシナリオを作成することの難しさは言うまでもありません。もうひとつ、APIテストの採用を妨げる根本的な問題は、開発者とテスターの間に存在する知識のギャップです。APIテストには、テスト担当者があまり持っていない知識と能力が必要ですが、マネージャーは開発者に統合テストやAPIテストをやらせることを望みません。

開発者はピラミッドの底辺から作業し、ユニットのレベルで作業するのを好みます。そこは自分たちのコード(少なくとも開発者の責任範囲)のレベルであり、ユニットテストはワークフローに自然に適合するように感じられます。ユニットテストの自動化ガイド付きユニットテスト作成により、このレベルでの効率が向上し、ソフトウェア業界はこのレベルでの徹底したテストの必要性を理解してもいます。

いっぽう、テスターはピラミッドの頂点からUIレベルで作業しています。このレベルでは、ユースケースとインターフェイスは直感的で、元となるビジネス要件に簡単にマッピングできます。テスターはアプリケーションを外から見ています。

APIテストは、これら2つの役割の中間に位置し、インターフェイスの設計に関する知識とその使用方法に関する知識の両方を必要とします。テスターは通常、APIをコードとして認識しているので、このレベルを扱いません。いっぽう、開発者はインターフェイスやAPIを理解していますが、他のサブシステムと組み合わせたとき、インターフェイスがどのように使用されるかを完全には把握していないことが多いので、 APIテストを機能テストとして認識し、自分の役割外だと考えます。

つい最近まで、ユニットテストとシステムテスト、そして開発者とテスターの間のギャップを埋めるのに役立つようなテストツールによる自動化技術はありませんでした。ソフトウェア産業が今日見られるマティーニグラス型から脱却し、理想的なテストピラミッドに近づいていくために、Parasoftは敷居が低く使いやすい機能テスト自動化ツールParasoft SOAtestSmart API Test Generatorを導入しました。

マティーニグラスを返上する

Smart API Test Generatorは、手動テストをモニターし、人工知能を使って自動化されたAPIシナリオテストを作成するGoogle Chromeウェブブラウザーのプラグインであり、APIテストを採用するのに必要な技術スキルを引き下げ、チームや組織を横断する包括的なAPIテスト戦略を構築できるようにします。動作の仕組みは次のとおりです。

Smart API Test Generatorは、手動テストの実行中にバックグラウンドのトラフィックをモニターし、APIコールを識別し、パターンを検出し、APIコール間の関係を分析し、単なる一連のAPIテストステップではない完​​全で意味のあるAPIテストシナリオを自動的に生成します。

APIテストを始めやすくする

Smart API Test Generatorは、手動テストという、すでに実施しているテストプラクティスを使用してAPIテストシナリオを作成するため、テストチームがAPIテストを始めやすくします。また、手動テストまたは自動化されたUIテストとも異なり、記録されたAPIアクティビティは、テスターと開発者の両方にとって共有と理解が容易な単一の成果物となるため、両者の協力を容易にします。また、APIテストは、アプリケーション全体を組み立てる必要がある複雑なUIテストよりも欠陥の根本的原因を診断するのに役立ちます。

いっぽう、UIテストだけしか行っていない場合、開発者もテスターも、自分たちだけのコミュニケーションやデバッグの方法に閉じていて、そのために、欠陥が入り込んでから検出され、解決されるまでの間に長い待ち時間が発生したり、やりとりが何度も繰り返されることになりがちです。

APIテストシナリオのパワー

UIテスト時に記録されたAPIのやりとりをシナリオやユースケースに組み立てるには、何らかの構成作業を必要とします。SOAtest Smart API Test Generatorの人工知能は、さまざまなAPI呼び出し間の関係に基づいてシナリオを作成するのを支援します。

Smart API Test Generatorの支援がなければ、時間をかけてテストケースを調査し、パターンを見つけ、手動で各テストシナリオを形成する必要があるでしょう。さらに、Parasoft SOAtestは、直感的にアサーションを記述できるUIベースの手段を提供し、テスターがコードを記述することなく複雑なアサーションロジックを実行できるようにします。このような機能がなければ、ユーザーは各アサーションを手作業でコーディングしなければならないため、抜けや間違いの可能性があります。視覚的なツールやツール支援ロジックを使用してこれらのAPIテストを拡張し、大規模なテストスイートを作成することができます。

まとめ

ソフトウェア開発チームがユニットテスト、APIテスト、およびUIテストの理想的な配分を達成したいと願っているのは明らかですが、現実的には、平均的なチームは、ほどほどにユニットテストを行い、依然としてサイクル後半のUIテストとシステムテストに頼っています。APIテストは、開発者とテスターの間の理想的なコミュニケーションの仕組みを提供し、保守性の高い高度な自動化を実現し、パフォーマンステストやセキュリティテストにまで自動化を広げることを可能にします。

これらのテストをシフトレフトして、ソフトウェアライフサイクルの早い段階で実行することは、セキュリティおよびアーキテクチャの重大な欠陥を早期に検出することを意味します。Parasoft SOAtestSmart API Test Generatorが提供する自動化を利用することで、APIテストのアクセシビリティが向上し、意味のあるテストシナリオの作成にかかる時間を大幅に短縮できます。

(この記事は、開発元Parasoft社 Blog 「API testing is great, so why isn’t everyone doing it?」2018年5月24日の翻訳記事です。)

Parasoft SOAtest/Virtualizeについて

APIのテスト自動化とサービス仮想化を1ツールで

SOAtest/Virtualizeは、APIの開発者/利用者に向けてテストの自動化とテスト環境の仮想化の2つの側面から開発を効率化します。SOAtest/Virtualizeは、APIのテストドライバーを提供し、開発中のAPIのテストを自動化する機能と、APIを利用するアプリケーションが必要とするAPIをスタブとして仮想化する機能を同梱して提供します。

Top