Не удалось выполнить тестовый прогон: сбой инструментария из-за "java.lang.ClassNotFoundException"

Это моя первая настройка android test project для тестирования a android project.

Я создал очень простой тестовый пример, который я пытаюсь запустить, однако то, что у меня нет, не работает. Я получаю Test run failed: Instrumentation run failed due to 'java.lang.ClassNotFoundException'.

Я хотел бы удалить это больше, но я не получаю больше информации, например, какой класс он пытается найти и т.д. Любые идеи о том, как получить дополнительную информацию от ошибки? Любые общие области, на которые я должен обратить внимание, или что-то, что может потребоваться настроить, что я пропускаю?

Ниже приведена информация с консоли:

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

Дополнительные примечания:

В моем android test project я создал простой тест с пакетом, похожим на пакет, который соответствует классу, который я пытаюсь протестировать в моем android project. Так что-то вроде com.company.android.projectname. Я указал это в разделе android test project manifest file instrumentation.

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

Когда я изменил это, чтобы соответствовать этому, я получаю новую ошибку, которая говорит Test run failed: Unable to find instrumentation target package: com.company.android.projectname

Я не уверен на 100%, что это за targetPackage, и если мне нужно несколько инструментов для каждого пакета, который я хочу проверить, и т.д. Когда я устанавливаю его в com.company.android, то есть когда я получаю java.lang.ClassNotFoundException, Любые предложения были бы оценены, тем временем я продолжу свои усилия, чтобы понять это самостоятельно.

Ответы

Ответ 1

Выяснил мою проблему и отправил ответ для целей документации...

Корень моей проблемы состоял из двух разных вещей:

  • Я сделал несколько рефакторингов, которые меняют местоположение моего android.app.Application класс и мои действия. Это сделало меня таким основная программа не работала, так как мне нужно было обновить мой манифест в моем android project.
  • После внесения обновлений в мой манифест в моем проекте Android, мне пришлось сделать некоторые обновления в моем android test project, чтобы указать на обновленное местоположение класса, который расширяет android.app.Application.

После этого некоторые очистили и снова протестировали, и все было хорошо.

Ответ 2

FYI Я столкнулся с этим и должен был добавить

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

в теге <application/>

Ответ 3

У меня была эта проблема после слияния, в которой build.gradle указывал неправильный тестовый пакет, так как я использовал значение по умолчанию.

Просто удалив эти строки из build.gradle, он смог найти необходимые классы в пакете по умолчанию, который равен src/androidTest.

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

Это, вероятно, не будет точным решением, но, надеюсь, поможет кому-то в правильном направлении.

Ответ 4

Я столкнулся с этой проблемой сегодня, я принял специфический для Android файл ant build.xml, который находится в директории ${sdk.dir}/tools/ ant/"для выполнения все тестовые примеры в командной строке, но STDOUT сообщает мне об ошибке, как ваш:

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

Я потратил немного времени на выяснение этого, я нашел основную причину в корневом модуле AndroidManifest.xml, я думал, что элемент приложение ничего не нужно настраивать, поэтому я пропустил его в manifest, который вызывает мою проблему.

Я не уверен, что вы разделяете одну и ту же структуру со мной, поэтому я размещаю здесь свою структуру проекта, а также содержимое ключевого файла, надеюсь, что кто-то может помочь.

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

Моя структура проекта последовала за Android Test Projects, которую Google предлагает нам сделать, состоит из корневого библиотечного модуля, который поддерживает основную логику и тестовый модуль который внутри корневого модуля. Выше основные ресурсы проекта, но не все файлы, я отправлю ссылку на проект здесь, как только я его выпустил.

------------ Обновление 2014-01-06 --------------

В настоящее время мой проект был опубликован на моем github: aSQLitePlus-android, проверьте детали, если они заинтересованы.