web-dev-qa-db-fra.com

Échec du test: l'exécution de l'instrumentation a échoué en raison de 'Java.lang.ClassNotFoundException'

C'est la première fois que je configure un projet de test Android pour tester un projet Android. 

J'ai créé un scénario de test très basique que j'essaie d'exécuter, mais ce que j'ai n'a pas été exécuté. Je reçois un Test run failed: Instrumentation run failed due to 'Java.lang.ClassNotFoundException'

Je voudrais résoudre ce problème plus, mais je ne reçois pas plus d'informations, telles que la classe qu'il essaie de trouver, etc. Des idées sur la façon d'obtenir plus d'informations à partir de l'erreur? Y a-t-il des zones communes que je devrais examiner ou tout ce qui pourrait devoir être configuré et que je néglige?

Ci-dessous sont les informations de la console:

[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'

Notes complémentaires

Dans mon projet de test Android, j'ai créé un test simple avec un package similaire au package correspondant à la classe que j'essaie de tester dans mon projet Android. Donc, quelque chose comme com.company.Android.projectname. Je l'ai spécifié dans la section manifest du fichier instrumentation du projet de test Android. 

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

Quand j'ai changé cela pour que cela corresponde, j'ai une nouvelle erreur qui dit Test run failed: Unable to find instrumentation target package: com.company.Android.projectname

Je ne suis pas sûr à 100% de ce que devrait être targetPackage et si j'ai besoin de plusieurs instrumentations pour chaque paquet à tester, etc. Lorsque je le règle sur com.company.Android, je reçois le Java.lang.ClassNotFoundException.

16
James Oravec

Compris mon problème et je poste la réponse à des fins de documentation ...

La racine de mon problème était 2 choses différentes:

  1. J'ai refactorisé, ce qui modifie l'emplacement de ma classe Android.app.Application et de mes activités. Cela a rendu mon programme principal Ne fonctionnant plus, il fallait que je mette à jour mon manifeste dans mon Android project.
  2. Après avoir mis à jour mon manifeste dans mon projet Android, je devais effectuer certaines mises à jour dans mon Android test project pour qu'il pointe vers l'emplacement mis à jour de la classe qui étend Android.app.Application.

Après cela, a fait quelques nettoyages et testé à nouveau et les choses étaient bonnes.

5
James Oravec

FYI je suis tombé sur cela et a dû ajouter

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

dans mon tag <application/>

6
43matthew

Dans mon cas, j'essayais d'exécuter les tests sur l'émulateur de haricot jelly. L'instrumentation Android ne semble pas supporter Jelly Bean. Je pourrais faire les tests sur Lollipop.

Il est également possible que vous ne puissiez pas exécuter de tests Android avec le type de build de version. Assurez-vous que le type de construction de débogage est actif.

4
rpattabi

J'avais mis à niveau vers les bibliothèques Android et commencé à obtenir cette erreur. 

Pour résoudre ce problème, dans build.gradle, j'ai changé la ligne:

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

à

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

J'ai rencontré ce problème aujourd'hui, j'ai adopté antbuild.xml, spécifique à Android, qui se trouve dans le répertoire "$ {sdk.dir}/tools/ant /" pour effectuer tous les tests en ligne de commande, mais le STDOUT me signale une erreur, tout comme la vôtre:

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

J'ai passé un peu de temps à comprendre cela, j'ai trouvé la cause principale dans le AndroidManifest.xml du module racine, je pensais que l'élément application n'était rien à configurer, je l'ai donc omis dans l'élément manifest, qui causant mon problème.

Je ne suis pas sûr que vous partagiez la même structure avec moi, alors je poste ici la structure de mon projet, ainsi que le contenu du fichier clé, dans l'espoir d'aider quelqu'un.

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...

La structure de mon projet a suivi la description de (Android Test Projects }} _ que Google nous suggère de faire. Elle consiste en un module de bibliothèque racine contenant la logique de base et un module de test dans le module racine. Les ressources clés du projet sont décrites ci-dessus, mais il ne s’agissait pas de fichiers. Je posterai le lien du projet ici une fois que je le publierai.

------------ Mise à jour 2014-01-06 --------------

Actuellement, mon projet a été publié sur mon github: aSQLitePlus-Android _, vérifiez les détails si vous êtes intéressé.

0
VinceStyling

J'ai eu ce problème après une fusion, dans laquelle build.gradle spécifiait le mauvais package de test, car j'avais utilisé le paramètre par défaut.

En supprimant simplement ces lignes de build.gradle, il a été en mesure de trouver les classes nécessaires dans le package par défaut, à savoir src/androidTest.

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

Ce ne sera probablement pas la solution exacte, mais guidera, espérons-le, quelqu'un dans la bonne direction.

0
styler1972