Почему средство запуска тестов Android сообщает «Пустой набор тестов»?

98

Я бьюсь головой об стену, пытаясь понять, почему IntelliJ / Android сообщает «Пустой набор тестов». У меня есть небольшой проект с двумя модулями IntelliJ («Проекты» в Eclipse). В модуле модульного теста есть собственный файл AndroidManifest.xml, который я вставил внизу. Я пытаюсь запустить ActivityUnitTestCase, поскольку тесты будут зависеть от Context-object.

Имя пакета основного модуля - nilzor.myapp. Имя пакета тестового модуля:nilzor.myapp.tests

Почему testBlah()средство выполнения тестов не определяет -метод как тест?

<?xml version="1.0" encoding="utf-8"?>
<!-- package name must be unique so suffix with "tests" so package loader doesn't ignore us -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="nilzor.myapp.tests"
          android:versionCode="1"
          android:versionName="1.0">
    <!-- We add an application tag here just so that we can indicate that
         this package needs to link against the android.test library,
         which is needed when building test cases. -->
    <application>
        <uses-library android:name="android.test.runner"/>
    </application>
    <!--
    This declares that this application uses the instrumentation test runner targeting
    the package of nilzor.myapp.  To run the tests use the command:
    "adb shell am instrument -w nilzor.myapp.tests/android.test.InstrumentationTestRunner"
    -->
    <instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="nilzor.myapp"
                     android:label="Tests for nilzor.myapp"/>
</manifest>

А вот и мой тестовый класс :;

package nilzor.myapp.tests;

public class NilzorSomeTest<T extends Activity> extends ActivityUnitTestCase<T>{
    public NilzorSomeTest(Class<T> activityClass){
        super(activityClass);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

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

Вот некоторые из вопросов, в которых я до сих пор не уверен:

  1. Нужна ли мне аннотация над методом модульного тестирования?
  2. Нужно ли мне добавлять к методу префикс «test» или это только для тестов JUnit?
  3. Могу ли я иметь тесты в пакетах nilzor.myapp.tests?

Но главный вопрос этого поста - почему средство запуска тестов не обнаруживает мой тест ?

Нилзор
источник
Для пункта 3, если вы используете Android Studio, я рекомендую cmd+shift+tярлык, который автоматически создаст тестовый класс в правильном месте пакета, который соответствует классу, который вы в настоящее время редактируете.
Дэвид Аргайл Такер
На всякий случай заминируют кого-то еще, как меня. Убедитесь, что вы не забыли поставить @Testмаркер поверх теста.
Matt D

Ответы:

70

Вам необходимо предоставить конструктор по умолчанию для вашего тестового класса, например:

package nilzor.myapp.tests;

public class NilzorSomeTest extends ActivityUnitTestCase<ActivityYouWantToTest>{
    public NilzorSomeTest(){
        super(ActivityYouWantToTest.class);
    }

    @SmallTest
    public void testBlah(){
        assertEquals(1,1);
    }
}

по поводу других ваших вопросов:

  1. Нет. Мои тесты по-прежнему работают без каких-либо аннотаций, но я думаю, что это хорошая практика. Он позволяет указать размер запускаемых тестов. См. Какова цель аннотаций @SmallTest, @MediumTest и @LargeTest в Android? для более подробной информации.

  2. Да, нужна приставка "тестовая". InteliJ выдает предупреждение «метод никогда не использовался», когда нет префикса «тест», и пропускает этот метод во время выполнения теста.

  3. Да. Мои тесты организованы в подпакеты, и, похоже, все работает хорошо.

lmac
источник
5
В этом нет необходимости, если вы используете ActivityTestRule
Яир Кукиелка
Добавление конструктора по умолчанию помогло мне.
Драган Марьянович
54

Если это происходит «внезапно» или «это сработало 5 минут назад», моим решением было перейти в настройки Run / Debug и удалить все конфигурации в разделе «Android Tests». Иногда эти конфигурации повреждаются, если я реорганизую тестируемый класс (например, при переходе на новый пакет).

введите описание изображения здесь

tir38
источник
Это сработало для меня. Я получал ошибку Пустого набора тестов. Это могло быть потому, что я добавил PowerMockito после первоначального создания конфигурации.
Аджит Мемана
У меня часто возникают эти и другие проблемы при запуске тестов, когда конфигурации сборки работали правильно раньше. Я смог исправить их, применив такой подход.
stevehs17 03
3
После удаления конфигураций я щелкаю правой кнопкой мыши тестовый пакет в проводнике проекта (представление Android) и выбираю Create 'Tests in XXX...- затем он снова работал
TmTron
9

Ничто из вышеперечисленного не помогло мне. Что помогло, так это следование инструкциям :

Создать тестовую конфигурацию

В Android Studio:

  • Откройте меню «Выполнить» -> « Изменить конфигурации».
  • Добавить новую конфигурацию Android Tests
  • Выберите модуль
  • Добавьте конкретный инструментальный бегун:

  android.support.test.runner.AndroidJUnitRunner

Запустите вновь созданную конфигурацию.

serv-inc
источник
6

У меня была аналогичная проблема. Не знаю, почему это происходит, но я смог исправить это, перейдя в «Файл»> «Недействительный кеш / перезапуск» в Android Studio.

Джефф Стэплтон
источник
Это исправило это для меня, когда я получил ту же ошибку, что и OP, после рефакторинга имени моего тестового класса.
Марко
4

Я не знаю, помогает ли это для Android Studio, но у меня был какой-то конфликт Intellij-Gradle. Решил это "щелкнув правой кнопкой мыши" на тестовом файле и выбрав "скомпилировать файл ... Test.java". После этого я снова мог запускать одиночные тесты.

Котлинский
источник
2
Где этот "файл компиляции" на * Test.java? Какая версия Android Studio?
Марк Лапаса,
Как я пытался сказать выше, я не использую Android Studio. Я использую Intellij 15 proffesional. изображение выпадающего меню при щелчке правой кнопкой мыши <- я вставил изображение сюда.
kotlinski
4

У меня была такая же проблема с Android Studio 2.3.1, но оказалось, что это просто ошибка AS. Выполнение того же теста в версии 2.2.1 работает нормально.

Если вы используете только Android Studio на канале Cannary, я рекомендую вам также установить стабильную версию. http://tools.android.com/tips/using-multiple-android-studio-versions

Дэвид Аргайл Такер
источник
У меня тоже самое, стабильная 3.1.2 работает, 3.2 canary 15 нет.
ареколек
3

У меня были тесты, которые работали нормально, пока gradleне обновили студию Android.

Помимо добавления конструктора по умолчанию в ваши тесты, вам может потребоваться сделать некоторые из этих вещей, чтобы ваш набор тестов работал.

Под src/созданием androidTest/java/<your-package-name>/test. Обратите внимание на расширение androidTest. Все остальное, в том числе instrumentTest, работать не будет.

Добавьте это в build.gradle

sourceSets {
    testLocal {
        java.srcDir file('src/androidTest/java')
        resources.srcDir file('src/androidTest/resources')
    }
}



android{
    sourceSets {
       instrumentTest.setRoot('src/androidTest/')
    }
}

dependencies{
     testLocalCompile 'junit:junit:4.11'
}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    android.sourceSets.main.java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}

check.dependsOn localTest

Добавьте это в AndroidManifest.xml

 <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:label="Tests for my packaged app"
        android:targetPackage="<my-package-name>.test" />
Практик Мандрекар
источник
3

Для Intellij 15 я решил эту проблему:

  1. Открытие настроек «Структура проекта»
  2. Щелчок по "Модули" (слева)
  3. Вкладка «Источники»
    a. Щелкните правой кнопкой мыши исходный каталог (обычно src) и выберите «Источник».
    б. Щелкните правой кнопкой мыши каталог с тестами и нажмите «Тест»
    c. Щелкните правой кнопкой мыши свой выходной каталог и нажмите «Исключено».
  4. Перейдите на вкладку «Пути»
    a. Установите переключатель «Использовать путь вывода компиляции модуля»
    b. Выберите каталог пути вывода для «Путь вывода»
    c. Выберите каталог тестового пути для 'Test output Path'
  5. Нажмите ОК
Маркиз Блаунт
источник
3

Очевидно, что вам нужно целевое устройство для запуска тестов, поскольку они являются инструментальными тестами. По некоторым причинам студия Android иногда не просит вас указать на это целевое устройство, а просто выводит сообщение «Empty Test Suite». Есть разные способы исправить это, вот несколько:

  • запустите основное приложение и выберите целевое устройство или

  • перейдите в конфигурацию Run (Run / Run ... / Edit Configurations) и измените параметры Deployement Target

user2243632
источник
Просто чтобы помочь кому-нибудь, если они попробуют ваше решение. В моем случае мне пришлось сначала запустить реальное приложение на устройстве / эмуляторе, и после этого мой AndroidTest смог увидеть устройство для запуска тестов. После этого все заработало. Даю плюс один за ответ.
A_P 08
2

В моем случае ни один из предыдущих ответов не помог. Решением было просто переместить тестовый класс в другой пакет .

Это произошло под androidTest/

Матеус Гондим
источник
2

В моем случае эта проблема была вызвана ошибкой в ​​моем коде, на самом деле это было в классе приложения, поэтому целевая активность не была открыта, и тестовые выходные отпечатки

Ошибка пустого набора тестов

Я пробовал запускать тесты прямо с терминала с помощью adb shell am instrument -w -r -e package your.package -e debug false android.support.test.runner.AndroidJUnitRunner. При этом он печатает для вас гораздо больше об исключениях.

Белу
источник
2

У меня была эта проблема, потому что это было в моем build.gradle:

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

Хотя я не использовал Android Test Orchestrator (должно быть, по ошибке скопировал из руководств).

Комментируя это, я решил эту проблему.

Пабло
источник
1

Ни одно из других решений у меня не сработало, но я смог заставить это работать, просто удалив существующее приложение или набор тестов, а затем запустив тесты.

Фил
источник
Это мне помогло. Я внес изменения на уровне базы данных перед запуском теста, поэтому класс в инструментальном тесте не мог работать. Странно, что Android Studio отображает такое нерелевантное сообщение.
PetroCliff
1

В моем случае в проекте, над которым я работал, было несколько модулей. Ни одно из решений, которые я нашел для этой ошибки, мне не помогло, и затем я каким-то образом понял, что если я добавлю тестовые зависимости в ОБЕИХ файлах build.gradle, тесты волшебным образом заработают. Не имеет значения, живут ли ваши тесты только в одном из модулей, оба файла gradle должны включать зависимости и значение testInstrumentationRunner.

Итак, если, как и я, ни один из других ответов вам не помог, попробуйте добавить эти строки в файл build.gradle каждого из ваших модулей:

android {    
    ....
    defaultConfig {
        ...
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }  
}

а затем также добавьте:

dependencies {
    ...
    // Test
    androidTestCompile 'com.android.support:support-annotations:23.4.0'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test:rules:0.5'

}
Хорхе Салас
источник
1

Я просто переименовал файл, и проблема решена.

Лин
источник
1

У меня была такая же проблема, и причина в том, что в моем тестовом классе не было Test в конце имени класса!

Джанин
источник
1

Моя проблема была вызвана исключением, возникшим в @BeforeClass метода моего тестового примера. Каким-то образом это не приводило к сбою теста - я обнаружил это, только проверив вывод logcat.

Я исправил исключение, и внезапно мои тесты запустились!

шокирующий
источник
мне то же. Похоже, исключения в BeforeClass не отображаются должным образом на панели запуска
Дэвид Рафаэли
1

Столкнувшись с проблемой сегодня - я не смог запустить инструментальные тесты Android с ошибкой Empty Suite - я обнаружил проблему с git, связанную с этой проблемой, и благодаря Стефану Линцнеру я смог запустить тесты.

tl; dr Вам нужно щелкнуть правой кнопкой мыши тестовый пакет, а не класс, чтобы запустить тесты.

Ссылка: https://github.com/googlecodelabs/android-testing/issues/27#issuecomment-219074863

Франциско Младший
источник
0

Эта статья мне помогла: Пустой набор тестов

В основном мне пришлось создать пакет - instrumentTest / java - в моем каталоге src и поместить туда все тесты. Тогда я смогу выполнить эти тесты индивидуально.

Игорь Ганапольский
источник
0

У меня был необработанный Java-проект, в котором это происходило. Просто Java + JUnit4. Он определенно находится с чем-то в ваших файлах .idea / или .iml. Я списал свой, повторно импортировал, и, наконец, тесты снова запустились.

cdaringe
источник
0

Тестовый класс может быть исключен из компиляции. Исправьте это в настройке-компилятора-exclude.

Петерц
источник
0

Вот мои шаги по отладке, которые я выполняю, когда Android Studio внезапно решает прекратить запуск / отладку тестов (и, черт возьми, это случается очень часто !!):

  • Сборка: → Перестроить проект
  • Перезагрузите устройство: перезагрузите устройство / эмулятор и повторите попытку.
  • Переключение устройств: если у вас есть и обычный телефон, и эмулятор, отключите один и попробуйте запустить его только с одним из устройств.
  • Android Studio: Файл -> Недействительный кеш и перезапуск
  • Монитор активности / Диспетчер задач: отсортируйте процессы по имени, посмотрите, есть ли безымянные процессы, которые используют много оперативной памяти, это «призрачный» процесс из студии Android, который необходимо убить
  • git revert: попробуйте сохранить / вернуть последний код. Иногда возникает ошибка компиляции, которую Android Studio / gradle пропускает, и он просто пытается запустить некомпилируемый код.
  • Удалите и переустановите Android Studio.

Я буду добавлять больше исправлений, когда столкнусь с ними!

горбисбм
источник
0

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

Гэри Дэвис
источник
0

В студии Android с фреймворком spock я изменил версию Gradle с 2.2.2 на 3.2.1, и все идет хорошо.

Псиджик
источник
0

Принятый ответ не решил мою проблему. Поэтому я решил скопировать то, ExampleInstrumentedTestчто по умолчанию создается в Android Studio и работает без проблем, переименовал его во время процесса копирования (без рефакторинга-> Переименовать после копирования!) И вставил в него содержимое моего модульного теста. После этого ошибка исчезла.

ka3ak
источник
0

При попытке запустить локальные модульные тесты в моем проекте Android Studio 3.0 возникла ошибка «Пустой тестовый набор».

Прочитав документацию разработчика Android , я быстро понял, что проблема была вызвана моей конфигурацией gradle, которая включала следующие строки.

testImplementation 'com.android.support.test:runner:0.5'
testImplementation 'com.android.support.test:rules:0.5'

Класс AndroidJUnitRunner - это средство запуска тестов JUnit, которое позволяет запускать тестовые классы в стиле JUnit 3 или JUnit 4 на устройствах Android. .

Поскольку мои тесты были локальными и, следовательно, не требовались для запуска на каком-либо устройстве, удаление указанных выше записей com.android.support.test ... позволило мне выполнить модульные тесты.

Будет P
источник
0

Я делал некоторые вставки в базу данных в методе @BeforeClass. Я понял, что у меня проблема с отображением объекта / базы данных. Эта проблема с отображением данных была для меня причиной этой проблемы.

Лоран
источник
0

В моем случае у меня были свои инструментальные тесты androidTest/java/<package.name>/MyTestingClass, но я установил свой текущий вариант сборки на «предварительную подготовку». И в этом суть! Как указано в документации Android Studio :

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

Сообщение Class not found. Empty test suite.продолжало появляться, пока я не сделал это:

  1. Добавьте эту строку в мой build.gradle :

    android{
        [...]
        testBuildType "preproduction"
    }
  2. Синхронизированный градиент.
  3. Удалите мои предыдущие тестовые конфигурации, поскольку они не принимают во внимание эту синхронизацию Gradle.

Затем я снова выполнил тесты, и на этот раз они прошли идеально !!!

Хуан Хосе Мелеро Гомес
источник
0

Это случилось со мной, когда я по ошибке пометил аннотацией переменную не фиктивного класса. @Mock Удалил аннотацию, и тесты прошли успешно. Это произошло с Junit 4.5 на Android Studio

Михир
источник
0

Не решение, а обходной путь, который быстро вернет вас в нужное русло:

  1. Во-первых, найдите тест, который работает. Я писал новый тест, в котором я получил ошибку «пустой набор тестов». Я провел другие тесты, и они работали как обычно.

  2. Скопируйте тестовый файл, который действительно работает. Запустите его, чтобы убедиться, что эта копия работает как оригинал.

  3. Удалите корпус и замените его новым тестовым кодом.

Теперь тест должен работать.

Мы потратили около двух часов, пытаясь найти причину, но безуспешно.

Xavierdominguez
источник