ナレッジNEW
【連載】なにそれ?あなたの知らないテストの言葉(第7回):差分テスト(Differential Testing)

マンガ連載:差分テスト(Differential Testing)

解説:差分テスト(Differential Testing)
このマンガ連載では普段目にすることが少ない「なにそれ」という用語をピックアップして解説します。
第7回は「差分テスト (Differential Testing)」です。
差分テストはソフトウェアの異なる二つのバージョンに同じ入力を行い、その差を比較することで想定外の振る舞いや欠陥の兆候を発見するテスト手法の一つです。
聞きなれないテスト手法ですが、皆さんも知らず知らずのうちに差分テストを行っています。
例えば、アプリを操作して気になったことがあった時に前のバージョンのアプリと振る舞いを比較し、差があった場合は報告や調査をするといった場面です。今まで行っていた活動に名前があったといったところでしょう。
マンガではAPIを題材として挙げましたが、もちろん手動テストでも行うことが可能なテスト手法です。
(補足)差分テストという言葉について
差分を比較して異常を検出するという考え方は、ソフトウェアテスト以外の分野でも広く使われています。
例えば医療分野では、血液検査の結果を過去の値と比較する デルタチェック(delta check / delta testing) が行われます。急激な変化がないかを確認することで、検査値の誤りや異常を検出します。
また、ソフトウェアテストでは Back-to-Back Test と呼ばれる似た手法もあります。これは複数のシステムや実装に同じ入力を与え、結果の一致性を確認するテストです。
いずれも「結果を比較することで問題を見つける」という共通の考え方を持っています。
メリット
期待結果を用意しづらい状況で活用できる
マンガの例のように期待結果を用意できない場合に、以前のバージョンを疑似オラクル(疑似的な期待結果)として、出力の差分から問題の兆候を発見するような使い方ができます。
差があるから直ちに問題というわけではなく、その差がノイズによるものか、修正によるものなのか、許容できる差なのかといった判断は必要です。
また、大規模で複雑なデータを扱うシステムがテスト対象だとデータの種類が多かったり、扱う範囲が広過ぎたりするため、全ての正解を用意することが困難です。こういった場合も本番のデータをサンプリングして差分テストを行うことでカバレッジを増やす、といったことができます。
差分により変更の影響範囲の把握ができる
変更を行った際、仮にあまりユニットテスト(Unit test)が書かれていない現場でも出力の差分を見ることで変更の影響が把握しやすくなります。また、テスト対象のコンポーネントに詳しくない他チームのメンバーがヘルプに来た時も、差分があるところに影響があったことが把握できます。
ただし、差分テストはあくまで補助的な手段です。粒度が荒い確認になってしまうため、Unit testなどをしっかりと記載するようにしてください。
デメリット
結果判定が自動化しづらい、分析時間がかかる
差分がノイズによるものなのか、意図した変更によるものなのか、許容範囲のものなのかを判定する必要があります。この分析作業が機械的に自動化しづらいという問題が挙げられます。また人による分析作業に時間がかかる、誤判定をしてしまうリスクもあります。
実行時間がかかる
差分テストはカバレッジを高めるため、本番環境に近い大量のデータを扱うことが多く、結果が得られるまで時間がかかる場合があります。
信頼性
後述するGoogleの報告では、282,423件の差分テスト実行のうち6.9%は未完了だったという結果が挙げられています。またシステム全体を対象としたとき、ネットワーク遅延や外部サービスへの依存などの要因で毎回異なる差分が出てしまう可能性があります。これらにより、本来検出されるべき不具合の差分が埋もれてしまうことがあります。
Googleによる差分テストの活用事例
ICSE(International Conference on Software Engineering) 2019 - SEIP(Software Engineering in Practice)で、Googleにおける差分テストの実践調査が報告されました。
ご参考に活用事例を一部ピックアップして記載します。
多機能システムにおけるリグレッションの検出
数多くのコンポーネントが連動する大規模システムでは、特定の機能を変更した際に他の機能への影響を検証する必要があります。Googleでは、何か変更を行った際、既存の全機能が壊れていないかを確認する包括的なサニティテストとして差分テストが用いられています。
パフォーマンスのリグレッションの検出
性能劣化の検出では明確な期待結果が定めにくいため、通常のテスト実行での検証が難しいですが、論文では性能比較に差分テストを使う例が報告されています。
一般的には、二つのバージョン間で実行時間やリソース使用量などを比較して性能の変化を評価・検証します。
新人さんからわかるソフトウェアテスト解説マンガやYouTubeチャンネルも公開中です。
よろしければこちらもご覧ください。
参照論文
M. A. Gulzar, Y. Zhu and X. Han, “Perception and Practices of Differential Testing,” in Proc. 41st Int. Conf. on Software Engineering: Software Engineering in Practice (ICSE-SEIP), Montreal, QC, Canada, May 2019, pp. 71–80, doi:10.1109/ICSE-SEIP.2019.00016.
この記事は面白かったですか?
今後の改善の参考にさせていただきます!




















































-portrait.webp)
































