J'ai essayé de réaliser un test d'interface utilisateur simple avec Espresso et tous mes tests échouent avec la même exception:
Java.lang.IllegalStateException: Aucune instrumentation enregistrée! Doit fonctionner sous une instrumentation d'enregistrement
C’est un guide d’initiation à l’utilisation de esspresso ici . J'ai déjà trouvé des questions similaires, mais les questions les plus pertinentes pour moi sont sans réponse ici - Je suppose que c'est parce qu'elles n'ont pas peint l'ensemble de l'image, voici donc mon code. Je ne montrerai qu'un seul test car ils échouent tous avec exactement la même erreur:
build.gradle (module: app)
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 27
defaultConfig {
applicationId "io.github.vinge1718.myrestaurants"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
//testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
dependencies {
testImplementation "org.robolectric:robolectric:3.8"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.Android.support:appcompat-v7:27.1.1'
implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.Android.support.test:runner:1.0.2'
androidTestImplementation('com.Android.support.test.espresso:espresso-core:3.0.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
})
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0'
androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
}
build.gradle (Projet: MonRestaurant)
buildscript {
repositories {
google()
jcenter()
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
dependencies {
classpath 'com.Android.tools.build:gradle:3.2.1'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
correction voici les deux tests. Je ne pense pas que l'erreur soit liée aux tests eux-mêmes mais aux configurations - je reste corrigé si
(MainActivityInstrumentationTest.Java)
package io.github.vinge1718.myrestaurants;
import Android.support.test.runner.AndroidJUnit4;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import androidx.test.rule.ActivityTestRule;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@RunWith(AndroidJUnit4.class)
public class MainActivityInstrumentationTest {
private String mStringToBetyped;
@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);
@Before
public void initValidString() {
// Specify a valid string.
mStringToBetyped = "Portland";
}
@Test
public void validateEditText(){
onView(withId(R.id.locationEditText))
.perform(typeText(mStringToBetyped), closeSoftKeyboard())
.check(matches(withText(mStringToBetyped)));
}
@Test
public void locationIsSentToRestaurantActivity(){
String location = "Portland";
onView(withId(R.id.locationEditText)).perform(typeText(location));
onView(withId(R.id.findRestaurantsButton)).perform(click());
onView(withId(R.id.locationTextView)).check(matches(withText("Here are all the Restaurants near " + location)));
}
}
J'ai essayé de suivre la documentation de configuration de cet espresso ici mais je continue à avoir la même erreur:
A commencé à exécuter des tests
Java.lang.IllegalStateException: Aucune instrumentation enregistrée! Doit courir sous une instrumentation d'enregistrement. à androidx.test.InstrumentationRegistry.getInstrumentation (InstrumentationRegistry.Java:50) à androidx.test.InstrumentationRegistry.getTargetContext (InstrumentationRegistry.Java:101) à androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:144) à androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:120) à androidx.test.rule.ActivityTestRule. (ActivityTestRule.Java:103) à io.github.vinge1718.myrestaurants.MainActivityInstrumentationTest. (MainActivityInstrumentationTest.Java:25) à Java.lang.reflect.Constructor.newInstance0 (Méthode native) à Java.lang.reflect.Constructor.newInstance (Constructor.Java:334) à org.junit.runners.BlockJUnit4ClassRunner.createTest (BlockJUnit4ClassRunner.Java:217) à org.junit.runners.BlockJUnit4ClassRunner $ 1.runReflectiveCall (BlockJUnit4ClassRunner.Java:266) à org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.Java:12) à org.junit.runners.BlockJUnit4ClassRunner.methodBlock (BlockJUnit4ClassRunner.Java:263) à org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.Java:78) à org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.Java:57) à org.junit.runners.ParentRunner $ 3.run (ParentRunner.Java:290) à org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.Java:71) à org.junit.runners.ParentRunner.runChildren (ParentRunner.Java:288) à l'adresse org.junit.runners.ParentRunner.access $ 000 (ParentRunner.Java:58) à l'adresse org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.Java:268) à l'adresse org.junit.runners.ParentRunner.run (ParentRunner.Java:363) à l'adresse Android.support.test.runner.AndroidJUnit4.run (AndroidJUnit4.Java:101) à org.junit.runners.Suite.runChild (Suite.Java:128) à org.junit.runners.Suite.runChild (Suite.Java:27) à l'adresse org.junit.runners.ParentRunner $ 3.run (ParentRunner.Java:290) à org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.Java:71) à org.junit.runners.ParentRunner.runChildren (ParentRunner.Java:288) à l'adresse org.junit.runners.ParentRunner.access $ 000 (ParentRunner.Java:58) à l'adresse org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.Java:268) à org.junit.runners.ParentRunner.run (ParentRunner.Java:363) à l'adresse org.junit.runner.JUnitCore.run (JUnitCore.Java:137) à l'adresse org.junit.runner.JUnitCore.run (JUnitCore.Java:115) à l'adresse Android.support.test.internal.runner.TestExecutor.execute (TestExecutor.Java:56) à Android.support.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.Java:384) à Android.app.Instrumentation $ InstrumentationThread.run (Instrumentation.Java:2075)
Les tests ont été terminés.
Voici les configurations de test décrites dans la configuration de l’espresso documentation :
Je pense que cela est dû au fait que les bibliothèques androidx
sont en conflit avec com.Android.support.test
. Si vous souhaitez utiliser jetpack, vous devez convertir toutes les bibliothèques de test en androidx. Si vous ne le souhaitez pas, supprimez simplement vos bibliothèques androidx
et utilisez tous les com.Android.support.test
. Vérifier ma dernière réponse dans Tests d'instrumentation Android: Aucune instrumentation enregistrée Erreur . J'espère que cela vous aidera.
J'ai eu le même problème et il y a une différence entre un test qui exerce des méthodes dans les classes, ces unités standard tests go in app/src/test/Java/<package>
. UI tests qui interagit avec les boutons, édite les textes, etc. nécessite un expresso et passe en app/src/androidTest/Java/<package>
. Il m'a fallu plusieurs lectures de la documentation et j'ai perdu une journée avant de comprendre la distinction.
|____app
|
| ____src
| |____androidTest
| | |____Java
| | |____<package>
| | |____ MainActivityInstrumentationTest.Java # expresso here
| |____test
| |____Java
| |____<package>
| |____ MainActivityInstrumentationTest.Java # not here