2015-01-15 1 views
9

Ich muss einige automatische Testaufträge zu einer Android-Anwendung ohne seinen Quellcode durchführen. Ich fand, dass sowohl Roboter als auch Espresso diese Arbeit machen können, ich entschied mich dafür, Espresso zu benutzen, weil sein Google-Support.'android.support.test.espresso existiert nicht', wenn ich es zum einzelnen apk Test verwenden möchte

Ich möchte sowohl die Ziel-Apk-und Espresso-Test apk mit der gleichen Signatur, die Ziel-Apk ist das gleiche wie this sample unterzeichnen.

enter image description here

Als ich die Codierung der Espresso-Test apk starten, habe ich die folgenden Jobs.

Das build.gradle in Modul: 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' 
} 

Der Quellcode meiner 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()); 
    } 
} 

Wenn ich dieses Programm zu starten versucht, mich Android Studio, dass Error:(6, 44) error: package android.support.test.espresso does not exist gesagt .

+1

Alles, was Sie geschrieben haben, sieht gut aus. Ist dein I01Test.java unter src/androidTest/oder src/main? Es sollte erster sein. – vaughandroid

+0

@Baqueta Ich habe nur die I01Test.java in die src/androidTest /, und führen Sie das TestModule, aber es gibt einen Fehler 'verursacht durch: java.lang.ClassNotFoundException: Nicht gefunden Klasse" tk.tubabe.instrustmen101.Instruments101 " '. Die Test-APK und die Ziel-APK sind zwei verschiedene APKs mit der gleichen Signatur. – liweijian

+0

Sollte "tk.tubabe.instrustmen101.Instruments101" "tk.tubabe.instrustmen ** t ** 101.Instruments101" sein? Sie können die Klasse einfach wie normal referenzieren, Sie müssen keine Reflexion verwenden, um sie zu finden. – vaughandroid

Antwort

5

Ich hatte das gleiche Problem und habe es durch Überprüfung meiner Projektstruktur zu arbeiten. Sind Ihre Tests unter src/androidTest? Ich hatte den Namen meines Ordner von Test zu androidTest

0

Ich verstehe nicht klar, Refactoring, was Sie ohne den Quellcode unter

... Android-Anwendung gemeint.

aber warum können Sie keine Aktivität aus der Testklasse ohne Reflexion aufrufen? Wie es in Espresso Start Guide gezeigt wurde.

Sie haben activity und entsprechende test, werfen Sie einen Blick auf das Paket, importierte Klassen, erweiterte Klasse und Konstruktor in diesen Beispielen. Ich meine, wie diese smth:

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

ich das gleiche Problem hatte, eine Sache, die mein Test Build war ruiniert ist die folgende Zeile:

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

Remove Testcode aus SRCDIRS:

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

Zu spät, aber kann jemandem helfen.

war mein Szenario dies -

Ich war Android Studio 2.2 (Stable) ausgeführt wird. Mein androidTest-Ordner befand sich in src /. In der "Android" -Ansicht zeigte mein Java-Ordner normalen Java-Ordner, Test-Ordner, Android-Test-Ordner und eine Kopie des androidTest-Ordners unter dem Namen "Java" (in grün). Der Täter war

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

Ändern Sie diese auf die folgende -

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

Meine App-Ebene zu bauen.Gradle sieht so aus

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' 
Verwandte Themen