はじめに

現代のプログラマーは、単体テストを使用することを確信する必要はないと確信しています。 そして、Android用のアプリケーション、それと関係のないモジュールを開発するときに、使い慣れたJUnitを使用してテストすることができます(ただし、
松葉杖がない場合
もあります)、それからユーザーインターフェイスとそれを使用するクラスをテストする方法は?
android.testフレームワークのツールはこれに役立ちます。
この記事では、小さなAndroidアプリケーションを作成してテストします。 作業には、インストール済みのjdk、android sdk、Eclipse、ADTプラグインが必要です。
パート1 SpeedConverter


プリミティブアプリケーションは、「1時間あたりのキロメートル」を「1秒あたりのメートル」に、またはその逆に変換し、必要な値を計算できない場合はエラーメッセージを表示します。 ユーザーは、EditTextに速度データを入力し、別のデータに結果を取得します。 これについてはもう詳しく説明しません。
XMLレイアウトフォーム:
<? xml バージョン = "1.0" encoding = "utf-8" ? >
< LinearLayout xmlns:android = " schemas.android.com/apk/res/android "
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:padding = "12dp" >
< TextView
android:id = "@ + id / textKmPerHour"
android:text = "@ string / kmh"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content" />
< EditText
android:id = "@ + id / editKmPerHour"
android:layout_height = "wrap_content"
android:layout_width = "match_parent"
android:inputType = "numberDecimal"
android:numeric = "decimal" />
< TextView
android:id = "@ + id / textMetersPerSec"
android:text = "@ string / ms"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:paddingTop = "4dp" />
< EditText
android:id = "@ + id / editMetersPerSec"
android:layout_height = "wrap_content"
android:layout_width = "match_parent"
android:inputType = "numberDecimal"
android:numeric = "decimal" />
</ LinearLayout >
*このソースコードは、 ソースコードハイライターで強調表示されました。
次に、1時間あたりのキロメートル数のEditTextのリスナーを設定し、イベントが発生したときに速度を計算します。 アクティブなソフトウェアキーボードでonKey()が発生しないというニュアンスは、テストの後半で考慮されます。 2番目のEditTextは類推によって機能します。
//キロメートル毎時のリスナーの設定EditText
editKmPerHour.setOnKeyListener( new OnKeyListener(){
public boolean onKey(View v、 int keyCode、KeyEvent イベント ){
if ( event .getAction()== KeyEvent.ACTION_UP){
{
double kmPerHour = Double.parseDouble(editKmPerHour
.getText()。toString());
double meterPerSec = kmPerHour * 0.277777777777777778;
editMeterPerSec.setText( new Double(meterPerSec)
.toString());
} catch (NumberFormatException e){
editMeterPerSec.setText(R. string .errorMsg);
Log.d(LOG、 「e:」 + e);
}
trueを 返し ます 。
}
falseを 返し ます 。
}
});
*このソースコードは、 ソースコードハイライターで強調表示されました。
それでは、テストに移りましょう。
パート2 SpeedConverterTest。
Androidテストプロジェクト
最初の部分では、SpeedConverterアプリケーションを作成しました。 彼のために、新しいテストアプリケーションを作成する必要があります。 eclipse'aメニューに移動します:表示されるウィンドウで
[ファイル ]
-> [新規]-> [プロジェクト ]を選択し、[
Android]-> [Android Test Project ]を選択して、[
次へ ]をクリックします。

以下の値を設定します。
- テストプロジェクト名:SpeedConverterTest
- テスト対象:「既存のAndroidプロジェクト」をインストールし、SpeedConverterプロジェクトを選択します
- アプリケーション名とパッケージ名は自動的に置き換えられます
完了をクリックします。
テストケースクラスの作成
プロジェクトの
src /ディレクトリで、新しいクラス
New> Classを作成します。 SpeedConverterTestと呼び、android.test.ActivityInstrumentationTestCase2をSuperClassとして指定します。 対話は次のようになります。

ActivityInstrumentationTestCase2についてもう少し説明します。 このクラスは、Androidアプリケーションでアクティビティをテストするように設計されています。 (InstrumentationTestCase.launchActivity()を使用して)アクティビティを作成し、UIスレッドでテストを実行し、さまざまなモックインテントをアクティビティに送信できます。 パラメーターとして、SpeedConverterを渡す必要があります。
テストフレームワークで使用されるテストケースコンストラクターを追加します。 パラメーターとして、テストするAndroidアプリケーションを示します。
public SpeedConverterTest(){
super( "com.pyjioh" 、SpeedConverter。class);
}
さらに、テストを実行する前に呼び出されるJUnitでおなじみのsetUp()メソッドは、その中の変数を初期化します。
@Override
protected void setUp()throws Exception {
// TODO自動生成メソッドスタブ
super.setUp();
アクティビティ= getActivity();
editKmPerHour =(EditText)アクティビティ
.findViewById(com.pyjioh.R.id.editKmPerHour);
editMeterPerSec =(EditText)アクティビティ
.findViewById(com.pyjioh.R.id.editMetersPerSec);
}
テストの追加を開始します。UIとの対話方法を示すために簡単になります。最初のテストでは、SpeedConverterアクティビティが作成および開始されたかどうか、およびコントロールにアクセスできるかどうかを確認します。
public void testControlsCreated(){
assertNotNull(アクティビティ);
assertNotNull(editKmPerHour);
assertNotNull(editMeterPerSec);
}
ViewAssertsのassertOnScreen()メソッドを使用して、コントロールが表示されるかどうかを確認します。
public void testControlsVisible(){
ViewAsserts.assertOnScreen(editKmPerHour.getRootView()、editMeterPerSec);
ViewAsserts.assertOnScreen(editMeterPerSec.getRootView()、editKmPerHour);
}
アプリケーションが空のEditTextsで始まるかどうか。
public void testStartingEmpty(){
assertEquals( "editKmPerHourは空ではありません" 、 "" 、editKmPerHour.getText()
.toString());
assertEquals( "editMeterPerSecは空ではありません" 、 "" 、editMeterPerSec
.getText()。toString());
}
km / sからm / sへの正しい変換を検証するテストを追加します。 その中で、必要なコントロールのタッチをシミュレートするTouchUtils.tapView(..)を使用し、KeyEvent.KEYCODE_BACKはソフトウェアキーボードを削除します。 void testConvertMsToKmh()メソッドは似ています。
public void testConvertKmhToMs(){
TouchUtils.tapView( this 、editKmPerHour);
sendKeys(KeyEvent.KEYCODE_BACK、KeyEvent.KEYCODE_1、KeyEvent.KEYCODE_0、
KeyEvent.KEYCODE_0);
ダブル meterPerSec;
{
meterPerSec = Double.parseDouble(editMeterPerSec.getText()
.toString());
} catch (例外e){
meterPerSec = -1;
}
assertTrue( "100 km / hは27.778 m / sではありません" 、meterPerSec> 27.7
&& meterPerSec <27.8);
}
最後のテストでは、エラーメッセージが表示されるかどうかを確認します。
public void testGetError(){
TouchUtils.tapView( this 、editKmPerHour);
sendKeys(KeyEvent.KEYCODE_1、KeyEvent.KEYCODE_DEL);
assertEquals( "Must be Error!" 、
activity.getString(com.pyjioh.R。string .errorMsg)、
editMeterPerSec.getText()。toString());
}
テストアプリケーションを起動します:
Run As> Android JUnit Test 。 以下のビデオは、それがどのように見えるかを示しています。
したがって、軽薄なアプリケーションの機能をテストしました。
他に何?
はい、実際、他のすべて。
android.testフレームワークの機能ははるかに広くなっています。 たとえば、ActivityInstrumentationTestCase2とは異なり、ActivityUnitTestCaseクラスを使用すると、モックContextまたはApplicationを使用してアクティビティを個別にテストできます。 すべてのテストツールについては、
developer.android.comの公式Webサイトをご覧ください。
SpeedConverterおよびSpeedConverterTestのソースコードはcode.google.comにあり
ます