Почему тестовый бегун Android сообщает "Пустой набор тестов"?

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

Название пакета основного модуля nilzor.myapp. Имя pacakge тестового модуля 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);
    }
}

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

Некоторые из вопросов, о которых я до сих пор не уверен, следующие:

  • Мне нужна аннотация над методом Unit test?
  • Нужно ли префикс метода "test", или это только для тестов JUnit?
  • Могу ли я иметь тесты в подпакетах nilzor.myapp.tests?

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

Ответ 1

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

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. Да, вам нужен префикс "test". InteliJ выдает предупреждение "метод никогда не используется", когда префикса "test" нет, и пропускает этот метод во время выполнения теста.

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

Ответ 2

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

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

Ответ 3

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

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

В Android Studio:

  • Открыть меню "Выполнить" → редактировать Конфигурации
  • Добавьте новые Android-тесты Конфигурация
  • Выберите модуль
  • Добавить конкретный измерительный прибор:

  android.support.test.runner.AndroidJUnitRunner

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

В 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" />

Ответ 8

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

  • Открытие настроек "Структура проекта"
  • Нажав "Модули" (слева)
  • вкладка "Источники"
    а. Щелкните правой кнопкой мыши на исходном каталоге (обычно src), нажмите "Источник".
    б. Щелкните правой кнопкой мыши на тестовом каталоге, нажав "Тест"
    с. Щелкните правой кнопкой мыши на своем внешнем каталоге, нажмите "Исключено".
  • Перейдите на вкладку "Пути"
    а. Нажмите переключатель "Использовать путь компиляции вывода модуля"
    б. Выберите каталог выходных путей для "Выходной путь"
    с. Выбрать каталог тестового пути для 'Test output Path'
  • Нажмите Ok

Ответ 9

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

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

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

}

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

Ответ 16

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

testOptions {
    execution "ANDROID_TEST_ORCHESTRATOR"
}

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

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

Ответ 17

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

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

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

Ответ 18

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

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

Ответ 19

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

Ответ 20

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

Ответ 21

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

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

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

Ответ 22

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

Ответ 23

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

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

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

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

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

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

Ответ 24

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

Ответ 25

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

Ответ 26

У меня возникла ошибка "Empty test suite" при попытке запуска локальных тестов в моем проекте Android Studio 3.0.

Прочитав документацию разработчика , я быстро понял, что проблема была вызвана моей конфигурацией 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... позволило мне выполнить модульные тесты.

Ответ 27

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

Ответ 28

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

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

Ответ 29

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

Ответ 30

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

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

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

  3. Снимите тело и замените его новым тестовым кодом.

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

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