wake-up-neo.com

Testlauf fehlgeschlagen: Instrumentationslauf aufgrund von 'Java.lang.ClassNotFoundException' fehlgeschlagen

Ich habe zum ersten Mal ein Android-Testprojekt zum Testen eines Android-Projekts eingerichtet. 

Ich habe einen sehr einfachen Testfall erstellt, den ich zum Laufen versuche, aber das, was ich habe, läuft nicht. Ich bekomme einen Test run failed: Instrumentation run failed due to 'Java.lang.ClassNotFoundException'

Ich würde dies eher stören, bekomme aber keine weiteren Informationen, wie zB welche Klasse es zu finden versucht usw. Ideen, wie man aus dem Fehler mehr Informationen bekommt? Gibt es allgemeine Bereiche, die ich mir ansehen sollte, oder irgendetwas, das konfiguriert werden muss, das ich übersehe?

Nachfolgend finden Sie die Informationen von der Konsole:

[2013-04-16 13:21:49 - XyzProgramTest] Android Launch!
[2013-04-16 13:21:49 - XyzProgramTest] adb is running normally.
[2013-04-16 13:21:49 - XyzProgramTest] Performing Android.test.InstrumentationTestRunner JUnit launch
[2013-04-16 13:21:49 - XyzProgramTest] Automatic Target Mode: launching new emulator with compatible AVD 'GalaxyNexusAPI_17'
[2013-04-16 13:21:49 - XyzProgramTest] Launching a new emulator with Virtual Device 'GalaxyNexusAPI_17'
[2013-04-16 13:21:53 - Emulator] extension WGL_ARB_make_current_read was not found
[2013-04-16 13:21:53 - Emulator] extension WGL_EXT_swap_control was not found
[2013-04-16 13:21:53 - Emulator] Failed to create pbuf surface for FB 0x3004
[2013-04-16 13:21:53 - Emulator] emulator: WARNING: Could not initialize OpenglES emulation, using software renderer.
[2013-04-16 13:21:54 - XyzProgramTest] New emulator found: emulator-5554
[2013-04-16 13:21:54 - XyzProgramTest] Waiting for HOME ('Android.process.acore') to be launched...
[2013-04-16 13:22:55 - XyzProgramTest] HOME is up on device 'emulator-5554'
[2013-04-16 13:22:55 - XyzProgramTest] Uploading XyzProgramTest.apk onto device 'emulator-5554'
[2013-04-16 13:22:55 - XyzProgramTest] Installing XyzProgramTest.apk...
[2013-04-16 13:23:57 - XyzProgramTest] Success!
[2013-04-16 13:23:57 - XyzProgramTest] Project dependency found, installing: XyzProgram
[2013-04-16 13:23:57 - XyzProgram] Uploading XyzProgram.apk onto device 'emulator-5554'
[2013-04-16 13:23:58 - XyzProgram] Installing XyzProgram.apk...
[2013-04-16 13:24:05 - XyzProgram] Success!
[2013-04-16 13:24:05 - XyzProgramTest] Launching instrumentation Android.test.InstrumentationTestRunner on emulator-5554
[2013-04-16 13:24:07 - XyzProgramTest] Test run failed: Instrumentation run failed due to 'Java.lang.ClassNotFoundException'

Zusätzliche Bemerkungen

In meinem Android-Testprojekt habe ich einen einfachen Test mit einem Paket erstellt, das dem Paket ähnelt, das mit der Klasse übereinstimmt, die ich in meinem Android-Projekt testen möchte. So etwas wie com.company.Android.projectname. Ich habe dies im Abschnitt manifest des Android-Testprojekts instrumentation-Datei angegeben. 

<instrumentation
    Android:name="Android.test.InstrumentationTestRunner"
    Android:targetPackage="com.company.Android.projectname" />

Wenn ich dies geändert habe, erhalte ich eine neue Fehlermeldung mit der Aufschrift Test run failed: Unable to find instrumentation target package: com.company.Android.projectname

Ich bin nicht zu 100% sicher, was das targetPackage sein soll und ob ich für jedes Paket, das ich testen möchte, mehrere Instrumentierungen benötige. Wenn ich es auf com.company.Android setze, bekomme ich den Java.lang.ClassNotFoundException.

16
James Oravec

Hat mein Problem herausgefunden und schreibe die Antwort zu Dokumentationszwecken ...

Die Wurzel meines Problems waren zwei verschiedene Dinge:

  1. Ich habe einige Refactorings durchgeführt, die den Speicherort meiner Android.app.Application-Klasse und meiner Aktivitäten ändern. Dies führte dazu, dass mein Hauptprogramm ___ nicht funktionierte, da ich mein Manifest in meinem Android project aktualisieren musste.
  2. Nachdem ich die Aktualisierung meines Manifests in meinem Android-Projekt vorgenommen hatte, musste ich einige Änderungen in meinem Android test project vornehmen, um auf den aktualisierten Speicherort der Klasse zu verweisen, die Android.app.Application erweitert.

Danach haben wir einige Reinigungen durchgeführt und erneut getestet und die Dinge waren gut.

5
James Oravec

Zu Ihrer Information bin ich darauf gestoßen und musste hinzufügen

<uses-library Android:name="Android.test.runner"/>

in meinem <application/>-Tag

6
43matthew

In meinem Fall habe ich versucht, die Tests mit dem Jelly Bean-Emulator durchzuführen. Android-Instrumente scheinen Jelly Bean nicht zu unterstützen. Ich könnte die Tests auf Lollipop durchführen.

Sie können möglicherweise auch keine Android-Tests über den Build-Typ der Version ausführen. Stellen Sie sicher, dass der Debug-Build-Typ aktiv ist.

4
rpattabi

Ich hatte ein Upgrade auf androidx-Bibliotheken durchgeführt und bekam diesen Fehler. 

Um dies zu beheben, habe ich in build.gradle die Zeile geändert:

testInstrumentationRunner 'Android.support.test.runner.AndroidJUnitRunner'

zu

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
4
Jerry Sha

Ich bin heute mit diesem Problem konfrontiert. Ich habe Android-spezifische Ant build.xml übernommen, die sich im Verzeichnis "$ {sdk.dir}/tools/ant /" befindet, um alle Testfälle in der Befehlszeile auszuführen, aber Der STDOUT meldet mir einen Fehler wie Sie:

vinceMacBook ~/dev/aSQLite+-Android/tests$ ant clean uninstall debug install test
...
test:
     [echo] Running tests ...
     [exec] INSTRUMENTATION_RESULT: shortMsg=Java.lang.ClassNotFoundException
     [exec] INSTRUMENTATION_RESULT: longMsg=Java.lang.ClassNotFoundException:
        Android.test.InstrumentationTestRunner
     [exec] INSTRUMENTATION_CODE: 0

Ich brauche einige Zeit, um das herauszufinden, ich fand die Hauptursache im AndroidManifest.xml des Wurzelmoduls. Ich dachte, das application -Element ist nichts zu konfigurieren, also habe ich es im manifest -Element weggelassen, welches verursacht mein problem.

Ich bin mir nicht sicher, ob Sie die gleiche Struktur mit mir teilen, also poste ich hier meine Projektstruktur, auch den Inhalt der Schlüsseldatei. Hoffentlich kann jemand helfen.

vinceMacBook ~/dev/aSQLite+-Android$ tree
.
├── AndroidManifest.xml
│       <?xml version="1.0" encoding="utf-8"?>
│       <manifest
│           xmlns:Android="http://schemas.Android.com/apk/res/Android"
│           package="com.vincestyling.asqliteplus"
│           Android:versionCode="1"
│           Android:versionName="0.1">
│
│           <uses-sdk Android:minSdkVersion="8" />
│           
│           <!-- important configuration, cannot be omit even if nothing to say. -->
│           <application />
│
│       </manifest>
│
├── build.xml
│       unchanged, generated by "Android create project <project_name>" command.
│
├── project.properties
│       unchanged, generated by "Android create project <project_name>" command.
│
├── src
│   └── com
│       └── vincestyling
│           └── asqliteplus
│               ├── DBOperator.Java
│               ├── DBOverseer.Java
│               └── the library source code lie here...
│
└── tests
    ├── AndroidManifest.xml
    │       <?xml version="1.0" encoding="utf-8"?>
    │       <manifest
    │           xmlns:Android="http://schemas.Android.com/apk/res/Android"
    │           package="com.vincestyling.asqliteplus.tests">
    │
    │           <application>
    │               <uses-library Android:name="Android.test.runner"/>
    │           </application>
    │
    │           <instrumentation
    │               Android:name="Android.test.InstrumentationTestRunner"
    │               Android:targetPackage="com.vincestyling.asqliteplus"/>
    │
    │       </manifest>
    │
    ├── ant.properties
    │       # [Comments], [Comments], [Comments] which generated by command.
    │       # [Comments], [Comments], [Comments] which generated by command.
    │       # [Comments], [Comments], [Comments] which generated by command.
    │
    │       # important configuration, point to the root library module.
    │       tested.project.dir=../
    │
    ├── build.xml
    │       unchanged, generated by "Android create test-project <project_name>" command.
    │
    └── src
        └── com
            └── vincestyling
                └── asqliteplus
                    ├── BaseDBTest.Java
                    ├── QueryStatementTest.Java
                    └── the test source code lie here...

Meine Projektstruktur folgte der Beschreibung von Android Test Projects , für die Google uns vorschlägt. Sie besteht aus einem Wurzelbibliotheksmodul, das die Kernlogik trägt, und einem Testmodul, das im Wurzelmodul enthalten ist. Oben sind die wichtigsten Ressourcen in einem Projekt, aber wenn nicht alle Dateien vorhanden sind, werde ich den Projektlink hier veröffentlichen, sobald ich ihn freigebe.

------------ Update 2014-01-06 --------------

Momentan wurde mein Projekt auf meinem github veröffentlicht: aSQLitePlus-Android , prüfe die Details bei Interesse.

0
VinceStyling

Ich hatte dieses Problem nach einer Zusammenführung, bei der build.gradle das falsche Testpaket angab, da ich den Standard verwendet hatte.

Durch einfaches Entfernen dieser Zeilen aus build.gradle konnten die erforderlichen Klassen im Standardpaket src/androidTest gefunden werden.

sourceSets {
    instrumentTest.setRoot('src/instrumentTest')
}
//removed this to use the default androidTest source set.

Dies wird wahrscheinlich nicht die exakte Lösung sein, führt aber hoffentlich jemanden in die richtige Richtung.

0
styler1972