0

を使用して Android アプリをテストしていJUnitます。実際にテストを行うのは初めてJUnitなので、進むべき道がわかりません。現在、連絡先リストへのクエリをテストしています。多くのメソッドはパラメータとして aRaw Contact IDまたは aのみを必要とし、Contact IDそれらのほとんどは a または を返します。JSON ObjectJSON ArrayArrayList

私の質問は、期待される結果と実際の結果をどのように比較すればよいですか?

現在、私は次のようにそれらをテストしています:

public void testGetRelationship() {
    JSONArray jsonArrayActual = new JSONArray();
    JSONArray jsonArrayExpected = new JSONArray();

    try {
        jsonArrayExpected = contact.getRelationship(RAW_CONTACT_ID);
    } catch (JSONException e) {
        e.printStackTrace();
        fail("Failed when calling the getRelationship method. " + e.getMessage());
    }

    Cursor cursor = getContext().getContentResolver().query(Data.CONTENT_URI, 
            new String[]{Relation.NAME, Relation.TYPE, Relation._ID, Relation.LABEL}, 
            Relation.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?", 
            new String[]{RAW_CONTACT_ID, Relation.CONTENT_ITEM_TYPE}, 
            null);

    if(cursor.moveToFirst())
    {
        do{ 
            try {
                final JSONObject jsonRelationshipObject = new JSONObject();

                final String name = cursor.getString(0);
                final Integer type = cursor.getInt(1);
                final Integer id = cursor.getInt(2);
                final String label = cursor.getString(3);

                jsonRelationshipObject.put("id", id);
                jsonRelationshipObject.put("type", type);
                jsonRelationshipObject.put("label", label);
                jsonRelationshipObject.put("name", name);

                jsonArrayActual.put(jsonRelationshipObject);
            } catch (JSONException e) {
                e.printStackTrace();
                fail("Failed while adding the values to the JSONObject. " + e.getMessage());
            }               
        } while(cursor.moveToNext());
    }
    else
    {
        cursor.close();
        fail("RawContact not found! ID: " + RAW_CONTACT_ID);
    }

    cursor.close();

    try {
        JSONAssert.assertEquals(jsonArrayExpected, jsonArrayActual, true);
    } catch (JSONException e) {
        e.printStackTrace();
        cursor.close();
        fail("JSONAssert exception: " + e.getMessage());
    }

}

基本的に、私は実際のメソッドを呼び出して、(テスト中の) メソッドをほとんど再コーディングしています。これは非生産的であるか、少なくとも非常に退屈で退屈だと思います (先ほどコーディングしたものをもう一度コーディングします)。JUnitテストを実行するためのより良い方法があると確信しています。連絡先リストのデータベースにクエリを実行し、比較するオブジェクトを手動で作成することを考えました。次のようにします。

public void testGetRelationship() {
    JSONArray jsonArrayActual = new JSONArray();
    JSONArray jsonArrayExpected = new JSONArray();

    try {
        jsonArrayExpected = contact.getRelationship(RAW_CONTACT_ID);
    } catch (JSONException e) {
        e.printStackTrace();
        fail("Failed when calling the getRelationship method. " + e.getMessage());
    }

    jsonRelationshipObject.put("id", 6);
    jsonRelationshipObject.put("type", 1);
    jsonRelationshipObject.put("label", "A label");
    jsonRelationshipObject.put("name", "the name");

    jsonArrayActual.put(jsonRelationshipObject);

    try {
        JSONAssert.assertEquals(jsonArrayExpected, jsonArrayActual, true);
    } catch (JSONException e) {
        e.printStackTrace();
        cursor.close();
        fail("JSONAssert exception: " + e.getMessage());
    }
}

コーディングする方が高速ですが、電話からデータベースを手動でダウンロードする必要があり (私にとっては大したことではありません)、そこにデータを取得するために手動でクエリを実行する必要があります (大したことではありません) が、そうではありません非常に一般的であるため、データベースが変更された場合、すべてのテストが失敗すると思います。しかし、データベースのスナップショットを取得して保存し、そのスナップショットに対して常にテストを実行できます。

助言がありますか?改善?

4

2 に答える 2

1

Mockito をご覧ください: https://code.google.com/p/mockito/

基本的に、データソース/サービス インターフェイス カーソル/コンテンツ リゾルバーをモックし、ハードコードされた値 (データベース スナップショットのサンプル) を使用して実装する必要があります。ただし、これは、クエリ メカニズムを維持する必要がある場合にのみ行う必要があります。これがプロジェクトの範囲外である場合、および/または実践していない場合、これは役に立ちません。

testGetRelationship の場合、これは統合テストに関するものです。パイプの片側にデータを注入し、反対側に同じデータを期待します。

その場合、JUnit は適切なツールではない可能性があります。JMeter は、これらのニーズに適しているはずです。JMeter を使用して JSON データをテストする例を次に示します。 Jmeter 抽出フィールド/JSON 応答の解析

SDLC で実際のデータ ソースに接続する「統合テスト」を追加しますが、それらはすべてのソース ビルド/開発サイクルを実行する必要はありません。エンドツーエンドの統合を確認するために、展開時にのみ「統合テスト」を実行する必要があります。

于 2014-03-27T10:31:11.943 に答える
0

単体テストは、データベースや外部サーバーを使用しない低レベルのテストです。検索するのは、統合テストまたはクリック テストです。

于 2014-03-27T09:43:20.577 に答える