'android.support.test.espresso does not exist' when I want to use it to individual apk test

喜夏-厌秋 提交于 2019-12-20 10:07:09

问题


I need to do some auto testing jobs to an Android application without its source code. I found both robotium and espresso can do this job, I decided to use espresso because its Google support.

I would like to sign both the target apk and espresso test apk with the same signature, the target apk is the same as this sample.

When I start to coding the espresso test apk, I did the following jobs.

The build.gradle in Module: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'
}

The source code of my 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());
    }
}

When I tried to run this program, Android studio told me that Error:(6, 44) error: package android.support.test.espresso does not exist.


回答1:


I had the same issue and got it to work by checking my project structure. Are your tests under src/androidTest ? I had to refactor the name of my folder from test to androidTest




回答2:


I had this same issue, one thing that was ruining my test build is the following line:

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

Remove test code from srcDirs:

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



回答3:


Too late but may help someone.

My scenario was this -

I was running Android Studio 2.2(Stable). My androidTest folder was inside src/ . In the "Android" view, my java folder was showing normal java folder,test folder ,androidTest folder and a copy of the the androidTest folder under the name "java" (in green). The culprit was

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

Change this to the following -

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

My app level build.gradle looks like this

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'



回答4:


I think you'd be better off not defining custom sourceSets. I just comment

sourceSets

from my build.gradle and its working fine.




回答5:


On my app build.gradle this dependency was missing:
androidTestImplementation 'com.android.support.test:rules:1.0.2'




回答6:


I didn't clearly understand what did you mean under

... Android application without its source code.

but why can't you call activity from the test class without reflection? Just how it was shown in Espresso Start Guide.

You have activity and appropriate test, take a look at the package, imported classes, extended class and constructor in those examples. I mean smth like this:

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

  <...>


来源:https://stackoverflow.com/questions/27956484/android-support-test-espresso-does-not-exist-when-i-want-to-use-it-to-individu

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!