sponsored by
Open Stream, Inc.




翻訳‎ > ‎Dev Guide‎ > ‎Developing‎ > ‎Testing‎ > ‎

Testing In Other IDEs

他の総合開発環境からのテスト




このドキュメントでははコマンドラインから直接テストを作成・実行する方法を説明する。Eclipse以外のIDEで開発もしくはコマンドラインでの作業を好むならここで説明するテクニックを利用できる。このドキュメントは利用するプログラミング環境でのAndroidアプリケーション作成方法を知っていると仮定している。このドキュメントを読む前にAndroidテストの概要を説明しているTesting Fundamentals(テストの基本)を読んでおくべきである。


ADTを導入したEclipseで開発を行なっている場合はEclipse上で直接テストをセットアップし実行することが可能である。さらなる情報はTesting from Eclipse with ADT(ADTを導入したEclipseでのテスト)を参照のこと。


テストプロジェクトのための作業


テストプロジェクトの作成にはandroidツールを使う。androidツールでは作成済みのテストコードをAndroidテストプロジェクトに変換することも既存のAndroidテストプロジェクトの"run-tests"Antターケットに追加することも可能である。これらの操作についての詳細はUpdating a test project(テストプロジェクトの更新)で説明している。run-testsターゲットについてはQuick build and run with Ant(Antによる速やかなビルドと実行)で説明する。


テストプロジェクトの生成


androidツールでのテストプロジェクトの作成を行なうには以下のように入力する:


android create test-project -m <main_path> -n <project_name> -p <test_path>

以下のフラグはすべて必須である。以下のテーブルに詳細を示す:


FlagValueDescription
-m, --mainテストパッケージディレクトリに対するテスト対象のアプリケーションプロジェクトへの相対パス。テスト対象アプリケーションがsource/HelloAndroidにあり、テストプロジェクトをsource/HelloAndroidTestに作成したい場合、--mainに../HelloAndroidを指定する。
テストプロジェクトの割り当て位置の選択についての更なる情報はTesting Fundamentals(テストの基礎)を参照のこと。
-n, --nameテストプロジェクトに割り当てたい名称
-p, --path作成するテストプロジェクトのディレクトリandroidツールはこのディレクトリにテストプロジェクトファイルやディレクトリ構造を生成する。このディレクトリが存在しない場合でもツールにより作成される。

操作が成功した場合には生成したファイルやディレクトリ名がSTDOUTに表示される。


これで適切なディレクトリとビルドファイルを有する新しいテストプロジェクトが生成される。ディレクトリ構造やビルドファイルは一般のAndroidアプリケーションプロジェクトとまったく同じである。詳細はManaging Projects(プロジェクト管理)【en】で説明している。


この操作によって実装情報であるAndroidManifest.xmlファイルも生成される。テストの実行時、テストするアプリケーションの読み込みや実装の制御にこの情報を利用する。


例えばHello, World【en】チュートリアルアプリケーションを~/source/HelloAndroidに作成すると仮定する。チュートリアルではこのアプリケーションのパッケージ名としてcom.example.helloandroidとアクティビティ名HelloAndroidを使っている。このアプリケーションに対するテストを~/source/HelloAndroidTestに作成するには以下のように入力しなさい:


$ cd ~/source
$ android create test-project -m ../
HelloAndroid -n HelloAndroidTest -p HelloAndroidTest

この操作によって~/source/HelloAndroidTestディレクトリが生成する。この新しいディレクトリ内にはAndroidManifest.xmlファイルがある。このファイルには以下のような実装関係の要素や属性が記述されている。


  • <application>:<uses-library>要素を含む。

  • <uses-library android:name="android.test.runner": このテストアプリケーションがandroid.test.runnerライブラリを利用していることを明示している。

  • <instrumentation>:Android実装をコントロールする属性が含まれる。
    • android:name="android.test.InstrumentationTestRunner":InstrumentationTestRunner【en】はテストケースを実行する。InstrumentationTestRunnerクラスはJUnitのテストケースランナークラスとアンドロイドのinstrumentationクラスを継承している。
    • android:targetPackage="com.example.helloandroid": HelloAndroidTestにおけるテストはパッケージ名com.example.helloandroidなアプケーションに対して実行されることを明示する。これはチュートリアルアプリケーションHello, World【en】のパッケージ名である。
    • android:label="Tests for .HelloAndroid": instrumentationクラスのユーザが読み込み可能なラベルを明示する。デフォルトでAndroidツールはテスト対象のアプリケーションのメインActivity名を"Tests for"の後ろに付ける。

テストプロジェクトの更新


androidツールはテスト対象のアプリケーションプロジェクトへのパス変更時にも利用可能である。ADTを導入したEclipseによって作成した既存のテストプロジェクトをコマンドラインからビルドや実行可能なように変更するには"create"操作が必要である。Creating a test project(テストプロジェクトの生成)を参照のこと。


ノート:テスト対象のアプリケーションのパッケージ名を変更する時はテストパッケージのAndroidManifest.xmlファイルの<android:targetPackage>要素の値を手動で変更するべきである。android update test-projectの実行ではこれについては不可能である。


androidツールでのテストプロジェクトの更新は以下のように入力する:


android update-test-project -m <main_path> -p <test_path>

FlagValueDescription
-m, --mainテストプロジェクトに対するテスト対象のアプリケーションプロジェクトへの相対パス。テスト対象アプリケーションがsource/HelloAndroidにあり、テストプロジェクトをsource/HelloAndroidTestに作成したい場合、--mainに../HelloAndroidを指定する。
-p, --pathテストプロジェクトのパス。テストプロジェクトがsource/HelloAndroidTestにある場合、--pathに HelloAndroidTestを指定する。

操作が成功した場合には生成したファイルやディレクトリ名がSTDOUTに表示される。


テストパッケージの生成


一度テストプロジェクトを生成するとそれおテストパッケージとして利用する。アプリケーションはActivity【en】を必ずしも必要としませんがそれを望むならば定義することが可能である。テストパッケージには複数のActivity、Androidテストクラスの継承クラス、JUnit継承クラスや一般的なクラスを結び付けることが出来るが最も良い特徴を提供するためにAndroidのテストケースもしくはJUnitクラスを継承すべきである。


InstrumentationTestRunner【en】(もしくは関連するテストランナー)でテストを実行するならばすべてのクラスのメソッドが実行される。これはTestSuite【en】クラスを利用することで変更することが可能である。


テストパッケージを生成するには、Javaパッケージのandroid.test【en】クラスの1つからスタートする。これらはJUnitのTestCase【en】クラスを継承している。若干例外はあるがAndroidテストクラスはテストの実装を提供する。


TestCase【en】を継承したテストクラスのsetUp()とtearDown()メソッドをオーバライドすることになる:


  • setUp():このメソッドはクラス内すべてのテストメソッドの前に呼び出される。テスト環境のセットアップに利用する。setUp()メソッドはACTION_MAINアクションを有するインテントオブジェクトをインスタンス化することが出来、テストにおいてこのインテントを利用してActivityを起動可能である。

ノート:このメソッドをオーバライドするならばコードの最初の行でsuper.setUp()メソッドを呼びだす。


  • tearDown():このメソッドはクラス内すべてのテストメソッドの後に呼び出される。ガベージコレクションと次のテストセット実行まえの再設定に利用する。

ノート:このメソッドをオーバライドするならばコードの最初の行でsuper.tearDown()メソッドを呼び出す。


他の有用な決まり事はテストクラスにtestPreConditions()メソッドを追加することである。このメソッドはテスト対象のアプリケーションが正しく初期化されているかどうかのテストに利用する。このテストが失敗した時は初期化条件にエラーがあることがわかる。この失敗が起こった時はテストが成功したかどうかにかかわらず続くテスト結果は疑わしいものとなる。


テストパッケージの生成に関する更なる情報はAndroidテストの概要を説明したTesting Fundamentals(テストの基礎)を参照のこと。チュートリアルを好むならば実際のアプリケーションのためのテスト作成を通じて説明されるActivity Testing(Activityのテスト)に挑戦してください。


テストの実行


テストはコマンドライン、AntまたはAndroid Debug Bridge(adb)【en】シェルから実行される。


Antによる速やかなビルドと実行


androidツールでテストプロジェクトを生成したとき自動生成されたAntのrun-testsターゲットを使って使ってテストプロジェクトのすべてのテストを実行することが出来る。


un-testsターゲットは必要であればメインプロジェクトとテストをビルドしAVDもしくはデバイスにテストアプリケーションをインストールしテストアプリケーションのすべてのテストを実行する。この結果はSTDOUTに表示される。


この特徴を利用して既存のテストプロジェクトの更新が可能である。これを行うにはandroidツールのupdate test-projectオプションを利用する。これはUpdating a test project(テストプロジェクトの更新)で説明している。


デバイスやエミュレータ上でのテスト実行


Android Debug Bridge(adb)【en】によるコマンドラインからのテスト実行時、テストを選択するために他のメソッドよりも多くのオプションがある。個々のテストを選択するか、アノテーションによってテストをフィルタするかまたはテストオプションを指定するか選択することが出来る。テストの実行はコマンドラインから完全に制御されることから、シェルスクリプトにより様々な方法でテストをカスタマイズ可能である。


コマンドラインからテストを実行するにはデバイスかエミュレータ上でコマンドラインシェルをスタートさせるためにadbシェルを実行し、am instrumentコマンドを実行する。コマンドラインのフラグによりamやテストを制御する。


要約するとadbシェルをスタートさせam instrumentを呼び出し、コマンドラインフラグをひとつの入力行にすべて明示する。シェルはデバイスもしくはエミュレータ上で開かれテストが実行されて出力が生成されてコンピュータ上のコマンドラインに返される。


am instrumentでテストを実行するために:


  1. 必要であればメインアプリケーションとテストパッケージをリビルドする。
  2. AndroidデバイスもしくはエミュレータにテストパッケージとメインアプリケーションのAndroidパッケージファイル(.apkファイル)をインストールする。
  3. コマンドラインで入力:

$ adb shell am instrument -w <test_package_name>/<runner_class>

test_package_name>にはテストアプリケーションのAndroidパッケージ名を<runner_class>には使用するAndroidテストランナークラス名を指定する。Androidパッケージ名はテストパッケージのマニフェストファイル(AndroidManifest.xml)におけるmanifest要素のpackage属性の値である。Androidテストランナークラスは通常InstrumentationTestRunner【en】である。


テスト結果はSTDOUTに表示される。


この操作はadbシェルをスタートさせ明示したパラメータでam instrumentが実行される。このコマンドの特定な形式はテストパッケージのすべてのテストを実行する。am instrumentに渡すフラグでこの振舞いは制御可能である。これらのフラグは次のセクションで説明する。


am instrumentコマンドの利用


am instrumentコマンドの一般的なシンタックス:


 am instrument [flags] <test_package>/<runner_class>

am instrumentへの主たる入力について次のテーブルで説明する:


ParameterValueDescription
<test_package>テストパッケージのAndroidパッケージ名テストパッケージのマニフェストファイル、manifest要素のpackage属性の値。
<runner_class>利用するInstrumentTestRunnerのクラス名。これは通常InstrumentationTestRunner【en】である。

am instrumentのフラグは以下のテーブルで説明している:


FlagValueDescription
-w(none)am instrumentは自身の実装が停止するまで強制待機する。実際の挙動としてはテストが終了するまでシェルを開いておくことです。このフラグは必須ではありませんがこのフラグを使用しないとテスト結果を見ることが出来ない。
-r(none)rowフォーマットで出力する。パフォーマンス測定をしたい場合に使うフラグであり、これらのテスト結果はフォーマットされていない。このフラグは-e pref trueとして利用するよう設計されています。(Instrumentオプションの項で記述)
-e<test_options>キーと値のペアとしてテストオプションを与える。am instrumentツールは自身のonCreate()メソッドを通じて指定された実装クラスへこれらを渡す。-e <test_options>を複数指定することが出来る。キーと値についてはam instrumentオプション]]の項で説明する。これらキーと値のペアを利用する唯一の実装クラスは[[InstrumentationTestRunnner【en】(もしくはサブクラス)である。他のクラスではまったく効果がありません。

am instrumentオプション


am instrumentツールは以下のようなシンタックスで-eフラグを利用しキーと値のペアをInstrumentationTestRunnerもしうはサブクラスにテストオプションを渡す:


-e <key> <value>


いくつかのキーは複数の値を許容する。複数の値はカンマ区切りされたリストで指定する。例えばInstrumentationTestRunnerの起動にはパッケージキーの複数値が与えられる:


$ adb shell am instrument -w -e package com.android.test.package1,com.android.test.package2 \
> com.android.test/android.test.InstrumentationTestRunner

以下のテーブルはキーと値のペアやその結果を説明している。テーブルに続いて利用ノートを参照のこと。


KeyValueDescription
Package<Java_package_name>テストアプリケーションにおける完全なJavaパッケージ名。このパッケージ名を使うとどんなテストケースのクラスも実行される。Androidパッケージ名ではないことに注意。テストパッケージは一つのAndroidパッケージ名を有するがいくつかのJavaパッケージ名があるかもしれない。
class<class_name>テストケースクラスの完全なJavaクラス名。このテストケースクラスのみ実行される。
class<class_name>#methodname完全なテストクラス名と1つのメソッド名。このメソッドのみが実行される。クラス名とメソッド名の間にハッシュマーク(#)が記載される。
functrueInstrumentationTestCase【en】を継承するすべてのテストクラスが実行。
unittrueInstrumentationTestCase【en】PerformanceTestCase【en】のどちらも継承しないすべてのテストクラスを実行
size[smaill|medium|large]サイズによってアノートされたテストメソッドを実行。アノテーションには@SmaillTest、@MediumTestや@LargeTestがある。
perftruePerformanceTestCase【en】インターフェイスを実装したすべてのクラスを実行。このオプションを利用するかam instrumentコマンドで-rフラグを指定した時、出力はrawフォーマットを維持しテスト結果として再フォーマットされない。
debugtrueテストをデバッグモードで実行。
logtrue指定されたすべてのテストをロードしログを記録しますが実行しない。テスト状況がSTDOUTに表示される。他のフィルタやテスト仕様との組合せ照合に利用する。
emmatureデバイス上でEMMAコードカバレッジ解析を実行し/data/coverage.ecに結果を出力する。ファイル位置を変更するには以下のエントリで説明するcoverageFileキーを利用する。
ノート:このオプションはカバレッジターゲットとして生成可能なテストアプリケーションのEMMA実装ビルドを要求する。
coverageFile<filename>デバイス上のEMMAカバレッジファイルの出力先を変更する。UNIX形式のパスとファイル名で指定する。デフォルトファイル名はemmaキーのエントリで説明さている。

"-e フラグ使用説明"



  • パッケージキーはクラスキーより優先される。パッケージを指定し、そのパッケージのクラスを別途指定してもAndroidはクラスキーを無視してパッケージのすべてのテストを実行する。

  • funcキーとunitキーは排他的である。

使用例


以下のセクションではテスト実行のためのam instrument使用例を準備する:


  • テストパッケージのAndroidパッケージ名はcom.android.demo.app.tests
  • テストクラスは3つ。
    • testPermissionsとtestSaveStateメソッドを有するUnitTests
    • testCamera、testXVGAとtestHardKeyboardメソッドを有するFunctionTests
    • testActivityProviderメソッドを有するIntegrationTests
  • テストランナーはInstrumentationTestRunner【en】

テストパッケージ全体の実行


テストパッケージのすべてのテストクラスの実行は次のように入力する:


$ adb shell am instrument -w com.android.demo.app.tests/android.test.InstrumentationTestRunner

テストケースクラス内のすべてのテストの実行


To run all of the tests in the class UnitTests, enter:

UnitTestsクラスのすべてのテストを実行するには次のように入力する:


$ adb shell am instrument -w  \
> -e class com.android.demo.app.tests.UnitTests \
> com.android.demo.app.tests/android.test.InstrumentationTestRunner

am instrumentは-eフラグの値を取得しクラスキーワードを検出してUnitTestsクラスのすべてのメソッドを実行する。


テストのサブセットを選択


UnitTestsすべてのテスト及びFunctionTestsのtestCameraメソッドを実行するには次のように入力する:


$ adb shell am instrument -w \
> -e class com.android.demo.app.tests.UnitTests,com.android.demo.app.tests.FunctionTests#testCamera \
> com.android.demo.app.tests/android.test.InstrumentationTestRunner

InstrumentationTestRunner【en】のドキュメントではさらなるコマンド例を見ることが出来る。


この記述はApache 2.0ライセンスのもとで記載しています。詳細や制限事項については、コンテンツライセンスを確認して下さい。

Android 2.3 r1 - 09 Feb 2011 1:08