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'
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
.
Hat mein Problem herausgefunden und schreibe die Antwort zu Dokumentationszwecken ...
Die Wurzel meines Problems waren zwei verschiedene Dinge:
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.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.
Zu Ihrer Information bin ich darauf gestoßen und musste hinzufügen
<uses-library Android:name="Android.test.runner"/>
in meinem <application/>
-Tag
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.
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"
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.
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.