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
.
I didn't clearly understand what did you mean under
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:
I had this same issue, one thing that was ruining my test build is the following line:
Remove test code from srcDirs:
I think you'd be better off not defining custom sourceSets. I just comment
sourceSets
from my build.gradle and its working fine.
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
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
Change this to the following -
My app level build.gradle looks like this
On my app build.gradle this dependency was missing:
androidTestImplementation 'com.android.support.test:rules:1.0.2'