Сбой тестового запуска: сбой инструментального запуска из-за «java.lang.ClassNotFoundException»

Это мой первый раз, когда я настраиваю тестовый проект Android для тестирования проекта Android.

Я создал очень простой тестовый пример, который я пытаюсь запустить, однако то, что у меня есть, не запускается. Я получаю 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 я создал простой тест с пакетом, похожим на пакет, который соответствует классу, который я пытаюсь протестировать в своем проекте Android. Итак, что-то вроде com.company.android.projectname. Я указал это в разделе instrumentation файла manifest тестового проекта Android.

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


person James Oravec    schedule 16.04.2013    source источник


Ответы (7)


Я обновился до библиотек androidx и начал получать эту ошибку.

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

testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'

to

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
person Jerry Sha    schedule 28.10.2018

К вашему сведению, я столкнулся с этим и должен был добавить

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

внутри моего тега <application/>

person 43matthew    schedule 30.09.2014

В моем случае я пытался запустить тесты на эмуляторе Jelly Bean. Инструментарий Android, похоже, не поддерживает Jelly Bean. Я мог бы запустить тесты на леденце.

Вы также можете не запускать тесты Android через тип сборки выпуска. Убедитесь, что тип сборки отладки активен.

person rpattabi    schedule 13.05.2018

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

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

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

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

person James Oravec    schedule 16.04.2013
comment
Не могли бы вы пояснить, что именно вы изменили на втором этапе тестового проекта? - person Paweł Byszewski; 25.02.2014
comment
@PawelByszewski, @Binghammer Прошло некоторое время с тех пор, как я делал этот пост, но по памяти... Я переместил местоположение класса, который расширил android.app.Application. Я думаю, что сделал лучший макет имен своих пакетов и переместил этот класс в процессе. Поскольку я сделал это, мне пришлось обновить его ссылку в файле манифеста. Например. Если в eclipse дважды щелкните AndroidManifest.xml, затем измените вкладку внизу на AndroidManifest.xml, затем найдите <application android:name="com.package.entry.point.class..." Надеюсь, это поможет. - person James Oravec; 23.02.2015

Я получил ту же ошибку, потому что забыл добавить тестовую зависимость androidx.test:runner.

androidTestImplementation "androidx.test:runner:1.2.0"
person Fartab    schedule 11.03.2020

Я столкнулся с этой проблемой сегодня, я принял специфичный для Android ant build.xml, который находится в каталоге «${sdk.dir}/tools/ant/» для выполнения всех тестовых случаев в command- строка, но 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, я думал, что элемент application не нуждается в настройке, поэтому я пропустил его в манифесте< /strong> элемент, который вызывает мою проблему.

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

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, которое Google предлагает нам do, состоит из корневого библиотечного модуля, несущего основную логику, и тестового модуля, находящегося внутри корневого модуля. Выше приведены ключевые ресурсы в проекте, но это не все файлы, я опубликую здесь ссылку на проект, как только выпущу его.

------------ Обновление 06.01.2014 --------------

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

person VinceStyling    schedule 31.12.2014

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

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

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

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

person tango whiskey double    schedule 29.07.2014
comment
я получаю эту ошибку после попытки The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin. Perhaps you misspelled something? - person vrgrg; 23.03.2021
comment
Да, учитывая, что этому ответу 7 лет, это неудивительно - person tango whiskey double; 26.03.2021