Simple Science

最先端の科学をわかりやすく解説

# コンピューターサイエンス# ソフトウェア工学

コールバック技術を使ったモバイルアプリのテスト自動化

新しい方法がモバイルアプリのテストを改善して、コールバックの発見と引数の生成を自動化するよ。

― 1 分で読む


モバイルアプリテストを強化モバイルアプリテストを強化する新しいアプローチ。効率的なコールバック駆動のアプリテストの
目次

モバイルデバイスの使われ方が増えてきたから、アプリがユーザーに届く前に正しく動いてるか確認するのがめっちゃ大事になってきたんだ。自動テストを使ってバグを見つけたり、全体のクオリティを上げたりすることができる。でも、ユーザーの操作に応じて反応するモバイルアプリのテストは難しいこともある。

アプリはユーザーのアクションに応じてイベントを通じて反応するんだけど、イベントってのはボタンを押すみたいな特定のアクションや出来事のこと。アプリがちゃんと動くか確認するにはこれらのイベントを生成して、アプリがどう反応するかテストしなきゃいけない。でも、各アプリのために全ての可能なイベントを作るのは難しいんだよね。

そんな中、コールバックドリブンテストっていう手法が役立つよ。イベントを一つずつ作る代わりに、この方法はイベントに反応する関数、いわゆるコールバックを直接呼び出すんだ。コールバックは、アクションが起こったときにアプリが使うショートカットみたいなもんなんだ。

でも、コールバックドリブンテストは期待が持てる一方で、コールバックの知識が必要だったりするから、専門家がアプリの機能を把握して、コールバックが正しく動くようにセッティングしなきゃいけないっていう大きな制約がある。アプリのフレームワークにはたくさんのコールバックがあって、フレームワークも時間と共に変化していくから、これがめっちゃ大変なんだよね。

この制約を克服するために、我々は人間の専門家がいなくてもアプリ内のコールバックを自動的に見つける新しい技術を提案するよ。私たちのアプローチは二つの方法を使ってる:

  1. 自動コールバック識別: フレームワークとアプリの両方を見て、事前の知識なしで使えるコールバックを見つける技術。

  2. スマート引数生成: これらのコールバックに対して、有効な入力引数を作るために、基本的な型にはシンボリック実行を、複雑なオブジェクトには動的分析を使ってる。

私たちの方法には、バグを見つけるチャンスを最大限にしつつ、アプリのカバレッジができるだけ広くなるように設計されたスマートなフィードバックメカニズムも含まれてるよ。

アプリテストの導入

スマホの使用が増える中で、アプリは社交から銀行、ゲームまで様々なタスクに欠かせないものになってきた。何百万ものアプリがアプリストアに揃ってるから、これらのアプリがうまく機能して良いユーザー体験を提供するのがめっちゃ大事なんだ。

アプリは複雑で、リッチなユーザーインターフェースや複雑なロジックを取り入れてることが多いよ。アプリをリリースする前に、開発者は潜在的なバグや問題を見つけるためにアプリを徹底的にテストしなきゃならない。現代のアプリはイベントドリブンで、つまりユーザーの操作がイベントを生成してアプリの状態を変えられるんだ。例えば、ボタンをクリックすると「クリック」イベントが生成されて、アプリが特定のアクションを実行するかもしれない。

アプリをテストする時、テストツールは通常アプリとやりとりするためにイベントを生成するんだけど、全ての可能なイベントを生成するのは、いろんな入力タイプや特定の順番が必要なため、めっちゃ複雑になることがあるんだ。

イベント生成の課題

多くの既存の自動テストツールはユーザーの操作に基づいてイベントを生成してる。確かに役立つんだけど、これらのツールはしばしば複合イベント、つまり特定の順番で一連のアクションを実行する必要があるイベントに対処できないことが多い。例えば、日付ピッカーで日付を選ぶためには、ユーザーが複数のアクションを実行しなきゃならなくて、これをランダムにテストツールで再現するのは難しい。

こうした課題のせいで、コールバックドリブンテストが人気になってきた。この方法はイベントを生成するんじゃなくて、イベントを処理するコールバックを直接呼び出すんだ。これによって、あらゆる可能なイベントを生成する必要がなく、コールバックが様々な状況にどう反応するかを効果的にテストできる。

ただ、コールバックドリブンテストにも限界があるんだ。既存のツールは、多くの場合、アプリが必要とするコールバックとその引数の知識を前提としてる。つまり、専門家が各コールバックのために特定のセットアップを作成しなきゃならなくて、大きく進化しているフレームワークのテストが難しくなるんだ。

私たちの解決策: 強化されたアプリテスト手法

私たちは、既存の手法の限界を克服する新しいコールバックドリブンテスト技術を提案するよ。我々のアプローチは、二つの重要な戦略を含んでる:

  1. コールバック発見: 我々のテスト技術の第一段階は、アプリとフレームワーク内の利用可能なコールバックを特定すること。これは静的解析で、フレームワークとアプリのコードを調べて、どのコールバックが定義されていて使えるかを見つけることによって行われる。

  2. 引数準備: アプリ内のどのコールバックが使えるかわかったら、そのコールバックに対して有効な入力引数を生成する必要がある。我々の技術は、原始データ型(整数や文字列など)のための可能な値を特定するためにシンボリック実行を使い、動的分析を用いて有効なオブジェクト引数を見つけ出す。

これらの戦略を実装することで、私たちの方法は人間の専門家からの事前の知識を必要とせず、コールバックを効果的にテストするために必要な入力を自動的に生成できるよ。

フィードバックメカニズム

探索プロセスをさらに効果的にするために、我々は二つの新しいフィードバックメカニズムを取り入れてる:

  1. データ依存フィードバック: このフィードバックは、共有変数に基づいて異なるコールバック間の関係を特定する。これらの依存関係を理解することで、コールバックの実行順序を制御し、初期化されていないデータに関連するバグを引き起こすチャンスを増やす。

  2. クラッシュ誘導探索: このメカニズムは、アプリ内のまだ探索されていないパスに探索を向ける手助けをする。もしコールバックがクラッシュに繋がったら、システムは今後のテストでその優先度を下げる。これによって、ツールが同じクラッシュを繰り返し再現しようとしてハマるのを防ぐ。

技術の評価

新しい手法の効果を評価するために、我々はテストアプローチを使ってさまざまなアプリをテストする実験を設計したよ。我々の技術を最先端のテストツールと比較して、発見されたクラッシュの数と達成されたコードカバレッジに基づいて評価した。

実験の結果、私たちの技術は大幅な改善を見せた。既存のツールよりも独自のクラッシュを多く特定し、テストしたベンチマークアプリケーションではより高いコードカバレッジを達成した。この結果は、私たちの方法がアプリのコード内の問題を探索して明らかにするのにより効率的であることを示唆してる。

実世界での応用

我々の手法をGoogle Playストアの実際のアプリケーションでもテストした。その結果、私たちの方法が人気アプリ内のバグを効果的に見つけられることが分かった。これによって、我々のアプローチの実用性がさらに裏付けられたよ。様々なクラッシュを発見して、私たちの方法が実際のアプリケーションがユーザーにリリースされる前に正しく機能するのを助けることができることを示してる。

コールバックドリブンテストの限界に対応する

私たちの技術はコールバックドリブンテストにおいて大きな進歩を遂げているけど、いくつかの潜在的な限界にも対処する必要がある。一つの懸念は、システムが時々偽陽性を生成する可能性があるってこと。つまり、通常のユーザー操作では起こらないクラッシュが発生しちゃうかもしれない。

潜在的な偽陽性

自動テストの性質上、コールバックへの呼び出しがアプリが実際のユーザーシナリオでどのように行動するかを正確に反映しないことがある。例えば、UIエレメントが無効なときにコールバックが実行されると、通常の使用時には起こらないクラッシュに繋がる場合がある。

こうした偽陽性の頻度を分析するために、我々のツールが見つけたクラッシュの中で、他の手法では発見されなかったものをレビューした。評価の結果、クラッシュの中で偽陽性があるのはごく小さな割合で、全体的に見て我々の技術が効率と正確性の良いバランスを提供していることが分かった。

まとめと今後の展望

まとめると、私たちの技術はコールバックドリブンテストを通じてモバイルアプリケーションのテストに現代的なアプローチを提供する。自動コールバック発見と革新的な引数生成を取り入れることで、専門知識の必要を減らしつつ、アプリテストの効率と効果を高めることに成功してる。

さらに、アプリの探索を改善するためにフィードバックメカニズムも統合して、高いコードカバレッジとユニークなクラッシュを見つけることに繋がった。我々の既存ツールとの評価では、クラッシュの発見とコードカバレッジの両方で従来の方法を大きく上回ることが証明された。

今後の取り組みとしては、他の種のユーザーインタラクションに対処できるようにシステムを拡張したり、引数生成の精度を改善することに焦点を当てることができる。また、ユーザー認証を必要とするアプリのログインプロンプトを自動的に処理できるようにすることで、実用性をさらに向上させることもできる。

私たちのアプローチを継続的に洗練させ、限界に対応することで、急速に進化するモバイルアプリケーションの品質保証に貢献し、最終的にはユーザー体験と満足度を向上させることができる。

オリジナルソース

タイトル: Columbus: Android App Testing Through Systematic Callback Exploration

概要: With the continuous rise in the popularity of Android mobile devices, automated testing of apps has become more important than ever. Android apps are event-driven programs. Unfortunately, generating all possible types of events by interacting with the app's interface is challenging for an automated testing approach. Callback-driven testing eliminates the need for event generation by directly invoking app callbacks. However, existing callback-driven testing techniques assume prior knowledge of Android callbacks, and they rely on a human expert, who is familiar with the Android API, to write stub code that prepares callback arguments before invocation. Since the Android API is huge and keeps evolving, prior techniques could only support a small fraction of callbacks present in the Android framework. In this work, we introduce Columbus, a callback-driven testing technique that employs two strategies to eliminate the need for human involvement: (i) it automatically identifies callbacks by simultaneously analyzing both the Android framework and the app under test, and (ii) it uses a combination of under-constrained symbolic execution (primitive arguments), and type-guided dynamic heap introspection (object arguments) to generate valid and effective inputs. Lastly, Columbus integrates two novel feedback mechanisms -- data dependency and crash-guidance, during testing to increase the likelihood of triggering crashes, and maximizing coverage. In our evaluation, Columbus outperforms state-of-the-art model-driven, checkpoint-based, and callback-driven testing tools both in terms of crashes and coverage.

著者: Priyanka Bose, Dipanjan Das, Saastha Vasan, Sebastiano Mariani, Ilya Grishchenko, Andrea Continella, Antonio Bianchi, Christopher Kruegel, Giovanni Vigna

最終更新: 2023-02-17 00:00:00

言語: English

ソースURL: https://arxiv.org/abs/2302.09116

ソースPDF: https://arxiv.org/pdf/2302.09116

ライセンス: https://creativecommons.org/licenses/by/4.0/

変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。

オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。

著者たちからもっと読む

類似の記事