2

Android Studio で簡単な計測テストを実行しようとしましたが、成功しませんでした。Unit Testsのガイドに従ったところ、問題なく動作しました。さて、モック化が難しいコンポーネントをテストしたいと思います。インストルメント化されたテストのガイドに従うと、依存関係エラーが発生します。

私がしたこと:

  • Android Testing Support Library (Android Support Repository、rev 17) をインストールします。

  • src にディレクトリ androidTest を作成します。「test」で終わる Java フォルダー + パッケージを追加します。

  • 簡単な Test クラスを追加する
 @RunWith(AndroidJUnit4.class)
    public class ServerRequestInstrumentationTest {
        @Test
        public void test(){
           LogC.d("Here we go testing !");
        }
    }
  • 簡単な TestSuit を追加します。
@RunWith(Suite.class)
@Suite.SuiteClasses({ServerRequestInstrumentationTest.class})
public class TestSuit {

    public TestSuit(){}
}
  • gradle ファイルを変更して依存関係を追加します。
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.mydomain.app"
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 28
        versionName "2.0.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            lintOptions {
                disable 'MissingTranslation'
            }
        }
    }
    sourceSets { main { java.srcDirs = ['src/main/java'] } }
}

dependencies {
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    wearApp project(':wear')
    compile project(':moreapps')
    compile project(':lib_repair')
    compile project(':bugreport')
    //testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:1.10.19'
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.1'
    androidTestCompile 'com.android.support.test:runner:0.3'
    androidTestCompile 'com.android.support.test:rules:0.3'
}

行を追加しただけです。androidTestCompile 'junit:junit:4.12'そうしないと、注釈@RunWith(AndroidJUnit4.class)が認識されませんでした。テストを起動すると、Gradle ビルド エラーが 1 つ発生します。

エラー:タスク ':app:dexDebugAndroidTest' の実行に失敗しました。

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: プロセス 'command '/usr/lib/jvm/jdkoracle/bin/java'' がゼロ以外の終了値 2 で終了しました

なにか提案を ?テストライブラリについて何か見逃しましたか?

ありがとうございました

4

4 に答える 4

1

よし、やっと動くようになった。

少し検索した後、Gradle コンソールがエラーを出力することがわかりました。

AGPBI: {"kind":"simple","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","sources":[{}]}
AGPBI: {"kind":"simple","text":"com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/TypeSafeMatcher;","sources":[{}]}

gradle ビルドで 1 行を変更した後、Gradle はプロジェクトを正常にビルドし、単純なインストルメント化されたテストを実行できました。

変更する行:

androidTestCompile 'org.hamcrest:hamcrest-library:1.1'

testCompile 'org.hamcrest:hamcrest-library:1.1'

Gradle があるケースでは文句を言い、他のケースでは文句を言わない理由はわかりません...

于 2015-09-03T09:49:45.257 に答える
0

あなたの答えには問題のヒントが含まれています。あなたはGradleがエラーを出すと述べています。これは、他の依存関係の 1 つがandroidTestCompilehamcrest に依存しているためです。これは、推移的な依存関係と呼ばれます。また、ハムクレストの明示的な要件を完全に削除できることも意味します。testCompileこの変更により、Android デバイスやエミュレーターではなく、開発マシンでローカルに実行される単体テストに使用される依存関係として hamcrest が追加されます。単体テストを作成していない場合、これは必要ありません。単体テストの作成を開始する場合でも、hamcrest への明示的な依存関係はおそらく必要ありません。

于 2016-02-10T02:35:44.203 に答える
0

@Gordark の回答はエラーをスローしませんが、インストルメンテーション テストで Hamcrest を使用する場合、これは適切な解決策ではありません。ローカル JVM テストでのみ機能します。

hamcrest-library の 1.3 バージョンを使用すると実際に機能することがわかりました。

androidTestCompile 'org.hamcrest:hamcrest-library:1.1'

androidTestCompile 'org.hamcrest:hamcrest-library:1.3'

そして、それはうまくいくはずです。junit と hamcrest の競合するバージョンに関するものだと思います。hamcrest 1.1 は junit bellow 4.12 のバージョンに依存しており、hamcrest 1.3 は junit v4.12 に依存していると思います。

于 2015-12-19T11:17:34.213 に答える
0

インストルメンテーション テストは、単体テストとは異なります。特定のクラスでテスト クラスを拡張する必要があります。詳細については、Android Testing Fundamentalsをご覧ください。また、インストルメンテーション テストに JUnit は必要ありません。

さらに、こちらで説明されているように、ビルド バリアントを単体テストから Android インストルメンテーション テストに切り替える必要があります。

例:

Android での計測テストの例を次に示します。

public class ExampleITest extends AndroidTestCase {

  @Override
  public void setUp() throws Exception {
    super.setUp();
    InputStream is = getContext().getAssets().open("test.xml");
    XmlParser parser = new XmlParser(getContext());
    parser.parse(is);
    ...
  }

  @MediumTest
  public void testSomething() throws Exception {      
    // test some data your parser extracted from the xml file
    ...
  }
}

ご覧のとおり、コンテキストなどにアクセスできます。このテストでは、gradle ファイルに特定の依存関係は必要ありません。

注釈だけのインスツルマンテーション テストについては聞いたことがありません。多分私はそれをウェブで調べるべきです;)

于 2015-09-02T08:58:33.637 に答える