2015-01-15 12 views
9

Ho bisogno di fare alcuni lavori di test automatico per un'applicazione Android senza il suo codice sorgente. Ho trovato sia robotium che espresso possono fare questo lavoro, ho deciso di usare l'espresso perché il suo supporto di Google.'android.support.test.espresso non esiste' quando voglio usarlo per il test apk individuale

Mi piacerebbe firmare l'apk di destinazione e l'apk di prova espresso con la stessa firma, l'apk di destinazione è lo stesso di this sample.

enter image description here

Quando inizio a codificare l'apk prova di caffè espresso, ho fatto i seguenti lavori.

Il build.gradle nel modulo: app:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "tk.deedog.i01test" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 

    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' 
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1' 
} 

Il codice sorgente del mio I01Test.java:

package tk.deedog.i01test; 

import android.app.Activity; 
import android.test.ActivityInstrumentationTestCase2; 

import static android.support.test.espresso.Espresso.onView; 
import static android.support.test.espresso.action.ViewActions.click; 
import static android.support.test.espresso.matcher.ViewMatchers.withText; 


public class I01Test extends ActivityInstrumentationTestCase2 { 
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "tk.tubabe.instrustmen101.Instruments101"; 
    private static Class<?> launcherActivityClass; 
    Activity i101Acitvity; 

    static { 
     try { 
      launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); 
     } catch (ClassNotFoundException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public I01Test() { 
     super(launcherActivityClass); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     i101Acitvity = getActivity(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
     super.tearDown(); 
    } 

    public void testButtonClick() { 
     onView(withText("Send")).perform(click()); 
    } 
} 

Quando ho provato a eseguire questo programma, Android in studio mi ha detto che Error:(6, 44) error: package android.support.test.espresso does not exist .

+1

Tutto ciò che hai postato sembra OK. Il tuo I01Test.java è sotto src/androidTest/o src/main? Dovrebbe essere il primo. – vaughandroid

+0

@Baqueta Ho appena inserito I01Test.java all'interno di src/androidTest /, ed eseguo il TestModule, ma c'è un errore 'Causato da: java.lang.ClassNotFoundException: Non ho trovato la classe" tk.tubabe.instrustmen101.Instruments101 " '. L'apk di test e l'apk di destinazione sono due apk diversi con la stessa firma. – liweijian

+0

"tk.tubabe.instrustmen101.Instruments101" essere "tk.tubabe.instrustmen ** t ** 101.Instruments101"? Puoi semplicemente fare riferimento alla classe come normale, non è necessario usare la riflessione per trovarla. – vaughandroid

risposta

5

Ho avuto lo stesso problema e ho funzionato controllando la struttura del mio progetto. I tuoi test sono sotto src/androidTest? Ho dovuto refactoring il nome del mio cartella da test per androidTest

0

Non ho capito chiaramente che cosa volevi dire sotto

... applicazioni Android senza il suo codice sorgente.

ma perché non è possibile chiamare l'attività dalla classe di test senza riflessione? Proprio come è stato mostrato nella Guida al caffè Espresso.

Avete activity e appropriato test, date un'occhiata al pacchetto, classi importate, classe estesa e costruttore in quegli esempi. Voglio dire smth come questo:

package com.google.android.apps.common.testing.ui.espresso.tests; 

import static com.google.android.apps.common.testing.ui.espresso.Espresso.onData; 
<...> 

import com.google.android.apps.common.testing.ui.testapp.R; 
import com.google.android.apps.common.testing.ui.testapp.SimpleActivity; 

import android.test.ActivityInstrumentationTestCase2; 
import android.test.suitebuilder.annotation.LargeTest; 

@LargeTest 
public class BasicTest extends ActivityInstrumentationTestCase2<SimpleActivity> { 

    public BasicTest() { 
    super(SimpleActivity.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
    super.setUp(); 
    getActivity(); 
    } 

    <...> 
0

Ho avuto questo stesso problema, una cosa che era rovinando la mia test build è la seguente riga:

main { java.srcDirs = ['src/main/java', 'src/AndroidTests', 'src/AndroidTest/java'] } 

codice di prova Rimuovi dal srcDirs:

sourceSets { 
    .... 
    main { java.srcDirs = ['src/main/java'] } 
} 
0

Troppo tardi ma potrebbe aiutare qualcuno.

mio scenario è stato questo -

stavo correndo Android Studio 2.2 (Stabile). La mia cartella androidTest era dentro src /. Nella vista "Android", la mia cartella java mostrava normale cartella java, cartella test, cartella androidTest e una copia della cartella androidTest sotto il nome "java" (in verde). Il colpevole era

sourceSets { 
.... 
main { java.srcDirs = ['src/main/java','src/androidTest'] } 
... 
} 

Modificare questo al seguente -

sourceSets { 
.... 
main { java.srcDirs = ['src/main/java'] } 
... 
} 

Il mio livello di applicazione build.gradle assomiglia a questo

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 24 
buildToolsVersion "24.0.2" 

defaultConfig { 
    applicationId "my.package.name" 
    minSdkVersion 16 
    targetSdkVersion 24 
    versionCode 1 
    versionName "1.0-debug" 
    multiDexEnabled true 
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

} 

packagingOptions { 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/NOTICE' 

} 
buildTypes { 
    release { 
     shrinkResources true 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
dexOptions { 
    preDexLibraries = false; 
} 
sourceSets { main { java.srcDirs = ['src/main/java'] } } 
} 

dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
compile 'com.android.support:appcompat-v7:24.2.0' 
compile 'com.android.support:design:24.2.0' 
compile 'com.android.support:support-v13:24.2.0' 
androidTestCompile 'junit:junit:4.12' 

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2') { 
    // Necessary if your app targets Marshmallow (since Espresso 
    // hasn't moved to Marshmallow yet) 
    exclude group: 'com.android.support', module: 'support-annotations' 
} 
androidTestCompile('com.android.support.test:runner:0.5') { 
    // Necessary if your app targets Marshmallow (since the test runner 
    // hasn't moved to Marshmallow yet) 
    exclude group: 'com.android.support', module: 'support- annotations' 
} 


} 
apply plugin: 'com.google.gms.google-services' 
Problemi correlati