'android.support.test.espresso does not exist&

2020-05-21 04:12发布

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.

enter image description here

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.

6条回答
劳资没心,怎么记你
2楼-- · 2020-05-21 04:38

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

  <...>
查看更多
一纸荒年 Trace。
3楼-- · 2020-05-21 04:42

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'] }
}
查看更多
啃猪蹄的小仙女
4楼-- · 2020-05-21 04:47

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

sourceSets

from my build.gradle and its working fine.

查看更多
Rolldiameter
5楼-- · 2020-05-21 04:55

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

查看更多
够拽才男人
6楼-- · 2020-05-21 04:55

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'
查看更多
看我几分像从前
7楼-- · 2020-05-21 05:00

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

查看更多
登录 后发表回答