2011-02-06 23 views
19

Androidでユニットテストを行う方法はいくつかありますが、私が作成したカスタムビューをテストするには最適な方法はありますか?Android:カスタムビューのテスト方法

私は現在、インストルメンテーションテストのケースでアクティビティの一部としてテストしていますが、単なるビューのみをテストしたいと思っています。

+0

あなたが 'ビューをテストする' とはどういう意味ですか? – pkananen

答えて

18

ウェルユニットテストは、ソースコードの個々の単位をテストして、使用に適しているかどうかを判断する方法です。カスタムビューをテストしたいと言うと、 "onTouchEvent"、 "onDown"、 "onFling"、 "onLongPress"、 "onScroll"、 "onShowPress"、 "onSingleTapUp"などのカスタムビューのさまざまなメソッドを確認できます。 "onDraw"など、ビジネスロジックに応じたさまざまなものがあります。モック値を提供してテストすることができます。私はあなたのカスタムビューをテストする2つの方法を提案します。

1)モンキーテスト モンキーテストは、自動テストツールによって実行されるランダムテストです。サルテストは、特定のテストを念頭に置いて実行される単体テストです。この場合のサルは、任意の入力のプロデューサーです。たとえば、サルテストでは、ランダムな文字列をテキストボックスに入力して、可能なすべてのユーザー入力を処理したり、データに盲目的な信頼性を持つローディングルーチンをチェックするガベージファイルを提供したりすることができます。これはブラックボックスのテスト手法であり、非常に多くのユニークな条件でカスタムビューを確認できます:)

2)ユニットテスト

2a)で使用RobotiumユニットテストFramwork

はRobotium.orgまたはhttp://code.google.com/p/robotium/に移動し、サンプルテストプロジェクトをダウンロードしてください。 Robotiumは、Androidアプリケーションのテストを簡単かつ迅速に行うための、本当に使いやすいフレームワークです。私はそれを最小限の労力で高度なアンドロイドアプリケーションのテストを可能にするために作成しました。 ActivityInstrumentationTestCase2と組み合わせて使用​​されます。ここで

2b)を使用Androidのテストフレームワーク

は、参照へのリンクです:手始めに http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.htmlhttp://developer.android.com/reference/android/test/ActivityUnitTestCase.html

http://developer.android.com/guide/topics/testing/testing_android.html

1人のユーザーによると:プラットフォーム以外の簡単なテストを除いて (私にとっては少なくとも で)実際のプラットフォーム 論理テストは厄介です。それは私が は、エミュレータと私の実際の デバイスとの間で実施 の違いを見つけたと私はその後アプリケーションを削除するだけで に私のデバイス上でユニットテスト 実装を実行することを憎むので、とにかくほとんど非自明な です。

私の戦略がされています:簡潔 ことを試してみて、ロジックウェル は、考え抜かれた後、一片(その後、望ましい 以下)によるテスト 実装片を作ります。

またステファン・ウは、Androidプロジェクトのソリューションのための本当のユニットテストのために良いaproachを提供します:https://sites.google.com/site/androiddevtesting/

あるユーザーはスクリーンキャストをしました。

ここでは、私がUnit Testsをどのように動作させるかについて、ScreenCastを作成しました。単純単位 コンテキストまたはアクティビティオブジェクトへの参照を持つことに依存するテストとより複雑なユニットテスト 。 http://www.gubatron.com/blog/2010/05/02/how-to-do-unit-testing-on-android-with-eclipse/

は、それはあなたが可能なすべての条件にカスタムビューをテストするのに役立ちます願っています:)


コメント(futlib)私が本当にしたいしながら、すべてのご提案は、活性を試験関与するように見えますVIEWだけをテストしてください。私は他のアクティビティでこのビューを使用したいかもしれないので、特定のものでテストするのはあまり意味がありません。 - futlib

回答:カスタムビューを実装するには、 あなたは通常、フレームワークは すべてのビューに呼び出す標準 方法のいくつかのために オーバーライドを提供することで開始されます。たとえば、 "onDraw"、 "onKeyDown(int、KeyEvent)"、 "onKeyUp(int、KeyEvent)"、 "onTrackballEvent(MotionEvent)"など のカスタムビュー。だから、 あなたのカスタムのユニットテストを行う場合は、 は にモック値を提供する必要がありますので、 はすべて のカスタムビューをテストできる可能性があります。これらのメソッドをテストすることが アクティビティをテストしているわけではありませんが、 がアクティビティ内にあるカスタムビュー(メソッド/関数)をテストすることを意味します。また、 ユーザーが最終的にそれを体験するために、 アクティビティでカスタムビューを配置する必要があります。 が完全にテストされたら、カスタムビュー を多くのプロジェクトに配置し、 多くのアクティビティを配置できます。

+1

あなたのすべての提案は、実際にVIEWをテストしたいのですが、ACTIVITYをテストする必要があります。私は他のアクティビティでこのビューを使用したいかもしれないので、特定のものでテストするのはあまり意味がありません。 – futlib

+0

@futlib、私は私の答えを編集し、それをより詳細に説明しました。チェックアウトしてください。 –

+0

それは物事をはっきりさせますが、私の中心的な質問は次のようなものです。それに対してどのようなテスト方法を使用できますか?計装テスト?それらにはアクティビティが必要です。それとも普通のJUnitテストですか?またはAndroidTestCaseまたはApplicationTestCase? – futlib

20

ビューに焦点を当てたTestCaseの実装がないための簡単な解決方法は、テストプロジェクト内にビューを含む単純なアクティビティを作成することです。これにより、単純なアクティビティを使用してビューに対してテストを書くことができます。活性試験の情報:

http://developer.android.com/reference/android/test/ActivityUnitTestCase.html

+0

これは、私が "モック"活動を作成しなければならないことを意味していますか?まあ、十分です。 – futlib

+0

+1の簡潔なバージョンです。 – cdhabecker

13

ここでは、多くの場合、正常に動作異なるの提案です:その後、ビューを膨らませる、あなたがAndroidTestCaseを使用することができ、あなたは、レイアウトファイル内からカスタムビューを参照していると仮定すると、孤立してテストを行う

my_custom_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<de.mypackage.MyCustomView ... 

MyCustomViewここではいくつかのサンプルコードです。Javaの:

public class MyCustomView extends LinearLayout { 

    public MyCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public void setTitle(CharSequence title) { 
     ((TextView) findViewById(R.id.mylayout_title_textView)).setText(title); 
    } 
... 

MyCustomViewTest.java:

public class MyCustomViewTest extends AndroidTestCase { 

    private MyCustomView customView; 

    @SuppressLint("InflateParams") 
    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     customView = (MyCustomView) LayoutInflater.from(getContext()) 
      .inflate(R.layout.my_custom_layout, null); 
    } 

    public void testSetTitle_SomeValue_TextViewHasValue() { 
     customView.setTitle("Some value"); 
     TextView titleTextView = (TextView) valueSelection.findViewById(R.id.mylayout_title_textView); 
     assertEquals("Some value", titleTextView.getText().toString()); 
    } 
... 
+0

'TextViewの' valueSelection'は何ですか?titleTextView =(TextView)valueSelection.findViewById(R.id.mylayout_title_textView); '? – beerBear

+0

正直言って(あまりにもずっと前ですが)確かに分かりませんが、誤植だと思います。おそらく 'customView'(これは' TextView'を含んでいます)です。 – csoltenborn

関連する問題