2012-03-27 5 views
11

Ho riscontrato un problema con il test della mia applicazione Android.
Ho 2 classi di testCase, se li eseguo separatamente, non ci sono problemi, i test vengono eseguiti fino alla fine. Ma se faccio "right-click" sul mio progetto di test e scegliere "Esegui come Android Junit Test" Ho un messaggioEsecuzione test non riuscita: esecuzione strumentazione non riuscita a causa di "Processo in arresto anomalo". durante il test di più attività Android

Launching instrumentation android.test.InstrumentationTestRunner on device emulator-5554 
[2012-03-27 15:56:27 - matroussedemaquillageTest] Collecting test information 
[2012-03-27 15:56:31 - matroussedemaquillageTest] Test run failed: Instrumentation run failed due to 'Process crashed.' 

vedi sotto per i miei due testClasses:

la prima classe di test

package fr.smardine.matroussedemaquillage.test; 

import android.test.ActivityInstrumentationTestCase2; 
import android.widget.ImageSwitcher; 
import fr.smardine.matroussedemaquillage.EntryPoint; 

public class EntryPointTest extends 
    ActivityInstrumentationTestCase2<EntryPoint> { 

private EntryPoint mActivity; 
    private ImageSwitcher mSwitcher; 

    public EntryPointTest() { 
     super("fr.smardine.matroussedemaquillage", 
       fr.smardine.matroussedemaquillage.EntryPoint.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
     super.tearDown(); 
    } 

    public void test2() { 
     assertEquals(2, 2); 
    } 
} 

e il secondo:

package fr.smardine.matroussedemaquillage.test; 

import android.test.ActivityInstrumentationTestCase2; 
import android.widget.ImageView; 
import fr.smardine.matroussedemaquillage.Main; 

public class MainTest extends ActivityInstrumentationTestCase2<Main> { 

    private Main mActivity; 
    private ImageView btRemplir; 
    private ImageView btPerime; 
    private ImageView btNotes; 

    public MainTest() { 
     super("fr.smardine.matroussedemaquillage", 
       fr.smardine.matroussedemaquillage.Main.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
     super.tearDown(); 
    } 


    public void test1() { 
     assertEquals(1, 1); 
    } 
} 

Come si può vedere il mio test non sono così complicato, anche se i "wip e dati utente "quando lancio il mio emulatore, c'è lo stesso messaggio se eseguo i due test.
Oh, a proposito, l'emulatore eseguito con Android 2.1 e questo è il mio file AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="fr.smardine.matroussedemaquillage.test" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" /> 

<instrumentation 
    android:name="android.test.InstrumentationTestRunner" 
    android:targetPackage="fr.smardine.matroussedemaquillage" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <uses-library android:name="android.test.runner" /> 
</application> 

</manifest> 

Edit: mio log gatto:

I/ActivityManager(64): Start proc fr.smardine.matroussedemaquillage for added application fr.smardine.matroussedemaquillage: pid=510 uid=10029 gids={3003, 1015} 
D/ddm-heap(510): Got feature list request D/dalvikvm(510): GC freed 5427 objects/420224 bytes in 90ms 
D/dalvikvm(510): GC freed 6498 objects/506616 bytes in 79ms 
D/dalvikvm(510): GC freed 7048 objects/567464 bytes in 90ms 
D/dalvikvm(510): GC freed 8628 objects/503840 bytes in 73ms 
I/System.out(510): Failed to open test.properties 
I/AndroidRuntime(510): AndroidRuntime onExit calling exit(-1) – 
D/Zygote(30): Process 510 exited cleanly (255) 
I/ActivityManager(64): Process fr.smardine.matroussedemaquillage (pid 510) has died. 
W/ActivityManager(64): Crash of app fr.smardine.matroussedemaquillage running instrumentation ComponentInfo{fr.smardine.matroussedemaquillage.test/android.test.Instrumentatio‌​nTestRunner} 
D/ActivityManager(64): Uninstalling process fr.smardine.matroussedemaquillage 
D/AndroidRuntime(504): Shutting down VM 
D/dalvikvm(504): DestroyJavaVM waiting for non-daemon threads to exit 
D/dalvikvm(504): DestroyJavaVM shutting VM down 
D/dalvikvm(504): HeapWorker thread shutting down 
D/dalvikvm(504): HeapWorker thread has shut down 
D/jdwp(504): JDWP shutting down net... 
D/jdwp(504): Got wake-up signal, bailing out of select 
I/dalvikvm(504): Debugger has detached; object registry had 1 entries 
D/dalvikvm(504): VM cleaning up 
D/dalvikvm(504): LinearAlloc 0x0 used 643668 of 5242880 (12%) 
I/dalvikvm(504): JNI: AttachCurrentThread (from ???.???) 
E/AndroidRuntime(504): ERROR: thread attach failed' 
+0

Assicurarsi che queste due attività in fase di test possano essere avviate correttamente nell'app effettiva sotto strumentazione (cioè nessuna eccezione runTime trapelata). Controlla se puoi ottenere un messaggio più interessante da Logcat. – yorkw

+0

ciao, grazie per il tuo commento, le due attività sotto strumentazione vengono lanciate correttamente nell'app. quando eseguo l'app non c'è eccezione. Se eseguo i due test separatamente, non ci sono eccezioni, l'eccezione si verifica solo se eseguo entrambi i testClass allo stesso tempo –

+0

Ci dovrebbero essere più dettagli mostrati in Logcat, quando si ottiene questo messaggio _Instrumentation esecuzione fallita a causa di 'Processo in crash. '_ mostrato in Console. Pubblica la tua Logcat aiuterebbe a indagare sul tuo problema. – yorkw

risposta

4

ho usato per ottenere questo errore quando ho usato System.exit (0) su OnFinish mia prova di attività come di seguito:

@Override 
    public void finish() { 
     super.finish(); 
     System.exit(0); 

    } 

Così controllare il metodo OnFinish del vostra attività principale.

1

Ho riscontrato anche questo errore. Tuttavia, ho finito per scoprire che la mia suite di test è stata eseguita, l'unico problema era che un'asserzione nel mio codice di test non funzionava.

Ho controllato LogCat e ho filtrato i messaggi Tag "TestRunner" e ho trovato il messaggio di errore di asserzione tra gli altri registri di test.

1

Ho riscontrato anche un problema simile durante l'esecuzione della mia strumentazione Android. Alla fine ho finito con la conclusione che il problema è System.exit (0).

Ora, la ragione per cui è causa il problema Secondo la documentazione

Causes the VM to stop running and the program to exit.

Quando System.exit (0) Viene eseguito tutti gli altri codice scritto dopo questo codice sono saltati e classe di attività ottiene finalizzato e vai per Garbage Collected. Poiché la strumentazione si basa sul metodo del ciclo di vita dell'attività, la classe di attività è Garbage Collection, non è possibile chiamare i suoi metodi se l'oggetto stesso non esiste.

Quindi evitare di utilizzare System.exit (0) se si desidera eseguire il test dell'unità dell'applicazione, utilizzare invece il metodo finish().

0

Nel caso in cui qualcun altro stia utilizzando anche Robotium e ha visto l'errore: Ho dimenticato a tearDown l'attività aperta e questo ha provocato l'errore come descritto sopra.

public void tearDown() throws Exception { 
    solo.finishOpenedActivities(); 
}