Androidアプリケーションのテスト

はじめに



画像

現代のプログラマーは、単体テストを使用することを確信する必要はないと確信しています。 そして、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 イベント ){

ifevent .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 ]を選択して、[ 次へ ]をクリックします。



画像



以下の値を設定します。

完了をクリックします。



テストケースクラスの作成


プロジェクトの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にあります



All Articles