Androidライブラリプロジェクトをテストする方法


97

私は、ユーティリティクラスのみ(アクティビティなし)を含むAndroidビットマップクラス(AndroindLibと呼びます)に基づくAndroidライブラリプロジェクトを作成しています。Android JUnitを使用してテストしようとしましたが、AnroidLib.apkが見つからないという不満が何度もあります

Androidライブラリプロジェクトを単体テストする正しい方法は何ですか?


1
または(恥知らずなプラグアラート)私が作成したプロジェクトを使用することもできます:Android Library Test Harness(「Alt H」と呼んでいます)。git repo:gitorious.org/althとして入手できます。プロジェクトはまだ開発中であり、ドキュメントはまばらなので、質問があれば遠慮なく私に連絡してください。
i41

回答:


75

ドキュメントの引用:

「ライブラリプロジェクトでコードとリソースのテストを設定するには、2つの推奨される方法があります。

  • ライブラリプロジェクトに依存するアプリケーションプロジェクトを計測するテストプロジェクトを設定できます。その後、ライブラリ固有の機能のテストをプロジェクトに追加できます。

  • ライブラリに依存する標準アプリケーションプロジェクトをセットアップし、そのプロジェクトにインスツルメンテーションを配置できます。これにより、テスト/計測器とテストするコードの両方を含む自己完結型プロジェクトを作成できます。」


27
したがって、基本的には、ライブラリをテストプロジェクトに追加して、テストプロジェクトをテストするだけです。
njzk2

リンクは無効になっています。現在のリンクを参照できる可能性はありますか?
Abdullah Jibaly


4
他の誰かがこれらの推奨事項で成功したかどうかはわかりませんが、私はそうではありません。最初に2番目のソリューションを試してみましたが、Eclipseで実行しようとすると、次のメッセージが表示されます。これは、マニフェストにインストルメンテーション要素と使用ライブラリ要素の両方を追加したという事実にもかかわらずです。
ベリングハンマー2011

2
2番目(そして望ましい方法で作業)を得た。マニフェストの正しい場所に、uses-library要素とInstrumentation要素を配置することが非常に重要です。インストルメンテーション要素はルートマニフェスト要素の子であり、uses-library要素はアプリケーション要素の子です。テストを実行しようとすると、uses-libraryをmanifest要素の下に置き、上記のエラーメッセージが表示されていました。
ベリングハンマー2011

17

テストプロジェクトで、パッケージ名を変更して、ライブラリのパッケージと同じになるようにします。たとえば、パッケージがであるライブラリがあるとします"com.example.lib"。ライブラリをターゲットとするテストプロジェクトを作成します。マニフェストファイルにはpackage="com.example.lib.test"、とが表示されますtargetPackage="com.example.lib"。パッケージを「com.example.lib.test」から「com.example.lib」に変更するだけです(そのtargetPackageままにしておきます)。

また、ライブラリがテストプロジェクトに参照されていることを確認しないで Eclipseでそれがにライブラリとして示されなければならない:Javaのビルド・パスではなく、通常のAndroidのライブラリとしてProject->Properties->Androidタブが、ないProject->Properties->Java Build Pathタブ。

次に、テストを実行します。


あなたのアイデアは私にとって理にかなっているので、テストはそれ自体を(アプリとして)対象とし、アプリはライブラリにリンクされています...しかし、ant buildやIntelliJを介してそれを機能させることはできませんでした... "test / bin /.- debug.apk"にコンパイルされているため、インストールしようとしたときに.apk(テスト対象のアプリに必要)は存在しませんでした
Andrew Mackenzie

ライブラリプロジェクトのパッケージ名と一致しないように、マニフェスト(およびテスト中のパッケージ-同じである必要があります)でテストプロジェクトのパッケージ名を変更するだけで機能し、ターゲットテストへの参照を削除しますant.propertiesファイルのプロジェクト。
アンドリューマッケンジー

1
私はこれが受け入れられたものよりも良い答えだと思います、それはちょうどドキュメントをエコーする-私見です。
アンドリューマッケンジー


5

ドキュメントごと:

ライブラリモジュールのテストは、アプリのテストと同じです。主な違いは、ライブラリとその依存関係がテストAPKの依存関係として自動的に含まれることです。つまり、テストAPKには独自のコードだけでなく、ライブラリのAARとそのすべての依存関係も含まれています。個別の「テスト対象アプリ」がないため、androidTestタスクはテストAPKのみをインストール(およびアンインストール)します。複数のマニフェストファイルをマージする場合、Gradleはデフォルトの優先順位に従い、ライブラリのマニフェストをテストAPKのメインマニフェストにマージします。


テストを実行するタスクは?Gradleテスト、またはgradle androidTest?androidTestはタスクではありません。
サニーデイ

ただし、Firebase Test LabなどのツールにはAPKまたはAABが必要であり、ライブラリのアセンブルタスクの出力であるAARファイルを受け入れません
Mustafa Berkay Mutlu

1

注: このソリューションはEclipse Indigo(3.8.2)の使用に基づいており、基本的な原則は同じですが、別のIDEに対しては少し異なる方法で実装する必要がある場合があります。

私は同様の問題があり、次のことを常に行うことがわかりました:

注:これらの手順は、新しいプロジェクトグループを最初から構築するためのものです。プロジェクトグループの一部を既に構築している場合は、同じ方法で接続するようにプロジェクトを変更する必要がある場合があります。

  1. 作成時に[Is Library]チェックボックスをオンにして、新しいAndroidライブラリプロジェクトを作成します。(たとえば、「RemingtonAndroidTools」という名前のAndroidプロジェクト)。
  2. Android Libraryプロジェクトをビルドし、binフォルダーにjarファイルが作成されたことを確認します。(たとえば、「RemingtonAndroidTools.jar」という名前のjarファイル)。
  3. Androidテストアプリとして機能するAndroidアプリをテストするための空のAndroidプロジェクトを作成します。(たとえば、「RemingtonAndroidToolsTestApp」という名前のAndroidプロジェクト)。テスト用に追加する必要があるものがない限り、Android Test Appプロジェクトのソースコードまたはリソースを変更する必要はありません。Android Test Appプロジェクトに変更を加えることなく、多くのことをテストできます。 Android Test Appプロジェクトは、Android LibraryプロジェクトとAndroid Junitプロジェクトの間の架け橋であり、Android Junitを介したAndroid Libraryプロジェクトのテストを可能にします。
  4. Android Test Appプロジェクト(この例では「RemingtonAndroidToolsTestApp」)のJavaビルドパスの[ライブラリ]タブに移動します。
  5. 「Jarを追加...」ボタンを使用して、Androidライブラリプロジェクトのjarファイル(この例では「RemingtonAndroidTools.jar」)(この例では「RemingtonAndroidTools」)を追加します。
  6. Android Library Testerとして機能する新しいAndroid Testプロジェクト(たとえば、「RemingtonAndroidToolsTester」)を作成し、ターゲットとしてAndroid Test Appプロジェクト(この例では「RemingtonAndroidToolsTestApp」)を選択します。
  7. Android Library Testerプロジェクト(この例では「RemingtonAndroidToolsTester」)のJavaビルドパスの[ライブラリ]タブに移動します。
  8. 「Jarを追加...」ボタンを使用して、Androidライブラリプロジェクトのjarファイル(この例では「RemingtonAndroidTools.jar」)(この例では「RemingtonAndroidTools」)を追加します。
  9. Android Library TesterプロジェクトでAndroidパッケージの最後のフォルダー(たとえば、「danny.remington.remington_android_tools_test_app.test」)を見つけ、ActivityInstrumentationTestCase2から継承するテストクラス(たとえば、「MainActivityTest」)を追加します。
  10. テストクラス(この例では「TestActivityTest」)を編集して、Androidテストアプリのアクティビティ(この例では「RemingtonAndroidToolsTestApp」)をActivityInstrumentationTestCase2のパラメーターとして使用します。
  11. テストクラス(この例では「TestActivityTest」)を編集し、super(Class)を呼び出してAndroidテストアプリのクラス(たとえば「TestActivity.class」)を渡すデフォルトコンストラクターを作成します。

これに似た3つのプロジェクト(Android Library、Android Test App、Android Library Tester)になるはずです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

次のようなAndroidライブラリをテストするためのクラスを作成する必要があります。

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

その後、必要なテストを追加できます。Android固有のコンポーネント(Assetsフォルダーなど)へのアクセスが必要でない限り、テストを実行するためにAndroidテストアプリ(この例では「RemingtonAndroidToolsTestApp」)をさらに参照する必要はありません。Android固有のコンポーネントにアクセスする必要がある場合は、Androidテストアプリ(この例では「RemingtonAndroidToolsTestApp」)を変更し、標準のAndroid Junit APIによって提供されるインスツルメンテーションを介して参照することで実行できます。(詳細については、http//developer.android.com/tools/testing/testing_android.htmlを参照してください)


0

ulitiyクラスがAndroid固有のコードに依存していない場合は、標準のJUnitユニットテストを使用できます。Androidバージョンを使用する必要はありません。


2
AndroidのJavaファイルがDalvik VMにコンパイルされる一方で、標準のJUnitは標準のJVMにコンパイルされるため、これは機能しません。
ダニーレミントン-OMS 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.