0

Je rencontre un problème lorsque j'essaie de faire des tests d'instrumentation avec Android. Lorsque l'un des tests échoue, la génération échoue mais n'indique pas que le test a échoué. Au lieu de cela, je reçois FAILURE: Build failed with an exception. Pour la section qui s'est mal passé, je reçois String index out of range: -1.La construction de la grille échoue avec "l'index de chaîne hors de portée" lorsque les tests Android échouent

Dans ma vraie application, cela ne génère pas non plus de rapport HTML, et le rapport XML est généré de façon sporadique. J'ai mis en place un cas de test simple, mais il génère le rapport, mais donne le même message d'échec.

Pour clarifier, le test est conçu pour échouer, mais je m'attendrais à un message A test has failed au lieu de ce qui ressemble à une raison de défaillance différente. Je soupçonne que l'échec fait que quelque chose d'autre dans le cycle de vie de la construction tourne mal, menant au message que je vois.

est ici l'application de test très simple

build.gradle

buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.4.0-alpha7' 
    } 
} 

apply plugin: 'com.android.application' 

repositories { 
    jcenter() 
    mavenCentral() 
} 

dependencies { 
    androidTestCompile "com.android.support.test.espresso:espresso-core:2.2.2" 
    androidTestCompile "com.android.support.test.espresso:espresso-intents:2.2.2" 
    androidTestCompile "com.android.support.test:runner:0.5" 
} 

android { 
    compileSdkVersion 24 
    buildToolsVersion '25.0.2' 

    defaultConfig { 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 

    buildTypes {   
     release { 
      minifyEnabled true 
      proguardFile getDefaultProguardFile('proguard-android.txt') 
     } 
    } 
} 

src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.test.bad" 
     android:versionCode="1" 
     android:versionName="1"> 
    <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="24" />  
    <application android:label="bad"> 
     <activity android:name="BadTestActivity" android:label="bad"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

src/main/java/test/bad/BadTestActivity.java

package com.test.bad; 

import android.app.Activity; 
import android.os.Bundle; 

public class BadTestActivity extends Activity { 

    /** Called when the activity is first created. */ 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 
} 

src/androidTest/java/com/test/mauvais/BadTest.java

package com.test.bad; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import static org.junit.Assert.fail; 
import android.support.test.runner.AndroidJUnit4; 

@RunWith(AndroidJUnit4.class) 
public class BadTest { 

    @Test 
    public void failTest() { 
     fail("This test just fails"); 
    } 

} 

Quand je lance gradle connectedAndroidTest, je vois

:connectedDebugAndroidTest 

FAILURE: Build failed with an exception. 

* What went wrong: 
String index out of range: -1 

* Try: 
Run with --stacktrace option to get the stack trace. Run with --info or --debug 
option to get more log output. 

Je compterait que pour Donner un message à propos de la construction échouant à cause d'un test échoué au lieu de quelque chose d'étrange comme cet index de chaîne. Dans ma vraie application (qui utilise aussi Kotlin et Mockito dans les tests) le rapport html n'est pas toujours généré (il y a beaucoup plus de tests, et je pense que cela a quelque chose à voir avec l'absence de rapport).

En utilisant --info ou --debug ne semble pas montrer quelque chose d'utile, mais en utilisant --stacktrace montre

* Exception is: 
java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
    at java.lang.String.substring(String.java:1967) 
    at org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput$StateContext.flushLineText(AbstractLineChoppingStyledTextOutput.java:115) 
    at org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput$2.execute(AbstractLineChoppingStyledTextOutput.java:167) 
    at org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput$2.execute(AbstractLineChoppingStyledTextOutput.java:160) 
    at org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput$1.execute(AbstractLineChoppingStyledTextOutput.java:146) 
    at org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput$1.execute(AbstractLineChoppingStyledTextOutput.java:131) 
    at org.gradle.internal.logging.text.AbstractLineChoppingStyledTextOutput.doAppend(AbstractLineChoppingStyledTextOutput.java:41) 
    at org.gradle.internal.logging.text.AbstractStyledTextOutput.text(AbstractStyledTextOutput.java:73) 
    at org.gradle.internal.logging.text.AbstractStyledTextOutput.println(AbstractStyledTextOutput.java:68) 
    at org.gradle.internal.logging.events.LogEvent.render(LogEvent.java:48) 
    at org.gradle.internal.logging.console.StyledTextOutputBackedRenderer.onOutput(StyledTextOutputBackedRenderer.java:65) 
    at org.gradle.internal.logging.sink.ProgressLogEventGenerator.doOutput(ProgressLogEventGenerator.java:72) 
    at org.gradle.internal.logging.sink.ProgressLogEventGenerator.onOutput(ProgressLogEventGenerator.java:62) 
    at org.gradle.internal.logging.console.BuildLogLevelFilterRenderer.onOutput(BuildLogLevelFilterRenderer.java:42) 
    at org.gradle.internal.logging.sink.OutputEventRenderer$4.onOutput(OutputEventRenderer.java:265) 
    at org.gradle.internal.logging.sink.OutputEventRenderer$LazyListener.onOutput(OutputEventRenderer.java:368) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42) 
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230) 
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149) 
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58) 
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324) 
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234) 
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140) 
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37) 
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy0.onOutput(Unknown Source) 
    at org.gradle.internal.logging.sink.OutputEventRenderer.onOutput(OutputEventRenderer.java:334) 
    at org.gradle.launcher.daemon.client.DaemonClient.monitorBuild(DaemonClient.java:216) 
    at org.gradle.launcher.daemon.client.DaemonClient.executeBuild(DaemonClient.java:178) 
    at org.gradle.launcher.daemon.client.DaemonClient.execute(DaemonClient.java:141) 
    at org.gradle.launcher.daemon.client.DaemonClient.execute(DaemonClient.java:92) 
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:51) 
    at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:173) 
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:287) 
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:260) 
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:33) 
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24) 
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33) 
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22) 
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:253) 
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:182) 
    at org.gradle.launcher.Main.doAction(Main.java:33) 
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60) 
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37) 
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23) 

J'utilise Windows 7, avec Gradle 4.0 (le problème existe avec 3.5 comme bien) et Java 8. Je cours mes tests sur un appareil physique - un Samsung Galaxy S6 exécutant Nougat 7.0.

Qu'est-ce qui cause ce message d'erreur? Est-ce ce que je devrais voir?

Répondre

1

Il semble que ce soit un problème connu avec Gradle sur Windows. There is a similar error description reported as issue 2077 et un correctif émis (apparemment cela est dû à plusieurs caractères). Il y a une note que ce problème doit être corrigé dans Gradle 4.1.

Mise à jour: 4.1 est maintenant sorti, et cela semble avoir été corrigé. L'application simple ci-dessus se comporte comme prévu, et la vraie application avec laquelle j'ai eu ce problème se comporte aussi exactement comme prévu.