Чому Android тест-бігун повідомляє "Порожній тестовий набір"?


98

Я стукаю головою об стіну, намагаючись з'ясувати, чому IntelliJ / Android повідомляє про "Порожній тестовий набір". У мене невеликий проект з двома модулями IntelliJ ("Проекти" в Eclipse). Тестовий модуль Unit має власний 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);
    }
}

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

Деякі питання, в яких я все ще не впевнений, є:

  1. Чи потрібна мені примітка над методом тестування одиниці?
  2. Чи потрібно мені префікс методу "тестувати", чи це лише тести JUnit?
  3. Чи можу я мати тести в підпакетах nilzor.myapp.tests?

Але головне питання цієї публікації - чому тестовий бігун не виявляє мого тесту ?


У пункті 3, якщо ви використовуєте Android Studio, рекомендую cmd+shift+tярлик, який автоматично створить тестовий клас у правильному розташуванні пакета, що відповідає класу, який ви зараз редагуєте.
Девід Аргіле Такер

На всякий випадок, коли хтось ще такий відсутній, як я. Переконайтеся, що ви не забули поставити @Testмаркер поверх тесту.
Метт Д

Відповіді:


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. Так. У мене тести організовані в підпакети, і, здається, це працює добре.


5
Це не обов'язково, якщо ви використовуєте ActivityTestRule
Yair Kukielka

Додавання конструктора за замовчуванням зробило роботу для мене.
Драган Мар’янович

54

Якщо це відбувається "раптом" або "воно працювало 5 хвилин тому", моє рішення полягало в тому, щоб запустити конфігурації Run / Debug і видалити будь-які конфігурації в "Тести Android". Іноді ці конфігурації пошкоджуються, якщо я перефактуюю тестований клас (наприклад, перейшовши на новий пакет).

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


Це працювало для мене. Я отримував помилку пустого тестового набору. Це може бути тому, що я додав PowerMockito після того, як конфігурація була створена спочатку.
Аджіт Мемана

У мене часто виникають ці та інші проблеми під час тестів, коли конфігурації збірок працювали належним чином раніше. Мені вдалося їх виправити, використовуючи такий підхід.
stevehs17

3
Після видалення конфігурації я клацнув правою кнопкою миші тестовий пакет у програмі провідника проектів (перегляд Android) і виберіть Create 'Tests in XXX...- потім він працював знову
TmTron

9

Ніщо з вищезазначеного не зафіксувало це для мене. Що допомогло, було слідування інструкціям :

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

В Android Studio:

  • Відкрийте меню «Запуск» -> « Редагувати конфігурації»
  • Додайте нову конфігурацію Android Tests
  • Виберіть модуль
  • Додайте конкретний інструментальний бігун:

  android.support.test.runner.AndroidJUnitRunner

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


6

У мене було подібне питання. Не знаю, чому це відбувається, але мені вдалося виправити це, перейшовши до: "Файл"> "Недійсний кеш / перезапуск" в Android Studio.


Це вирішило для мене, коли я отримав ту ж помилку, що й ОП, після рефакторингу назви мого тестового класу.
Марко

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 канарки 15 ні.
ареколек

3

У мене були тести, які до цього часу працювали нормально 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" />

3

Для Intellij 15 я вирішив це питання:

  1. Відкриття налаштувань «Структура проекту»
  2. Клацання "Модулі" (зліва)
  3. Вкладка "Джерела"
    a. Клацніть правою кнопкою миші на своєму вихідному каталозі (зазвичай src) та натисніть "Джерело".
    б. Клацніть правою кнопкою миші на тестовому каталозі та натисніть "Тест"
    c. Клацніть правою кнопкою миші на вашому каталозі, натисніть "Виключено"
  4. Перейдіть на вкладку "Шляхи"
    a. Натисніть перемикач "Використовувати модуль компіляції вихідного шляху"
    b. Виберіть каталог вихідного шляху для "Вихідний шлях"
    c. Виберіть каталог тестового контуру для "Шлях тестування виводу"
  5. Клацніть Гаразд

3

Очевидно, що для запуску тестів вам потрібен цільовий пристрій, оскільки це інструментальні тести. З певних причин студія Android іноді не просить вас вказати на цей цільовий пристрій і просто запросить повідомлення "Порожній тестовий набір". Існують різні способи виправити це, ось декілька:

  • запустіть основний додаток і виберіть цільовий пристрій або

  • перейдіть до конфігурації Run (Run / Run ... / Edit Configuration) та змініть параметри цілі розгортання


Просто, щоб допомогти комусь, якщо він спробує ваше рішення. У моєму випадку мені довелося спочатку запустити фактичний додаток на пристрої / емуляторі, а після цього мій AndroidTest зміг побачити пристрій для запуску тестів. Після цього все спрацювало. Давання плюс один за відповідь.
A_P

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

У моєму випадку проект, над яким я працював, мав пару модулів. Жодне із знайдених нами рішень для цієї помилки мені не допомогло, і тоді я якось зрозумів, що якщо я додаю тестові залежності в 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'

}

1

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


1

У мене був той самий випуск, і причина в тому, що мій тестовий клас не мав тесту в кінці назви класу!


1

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

Я виправив виняток і раптом мої тести працювали!


те саме для мене. Здається, що виключення в програмі BeforeClass не відображаються належним чином на панелі запуску
Девід

1

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

tl; dr Для запуску тестів потрібно клацнути правою кнопкою миші тестовий пакет, а не клас.

Довідка: https://github.com/googlecodelabs/android-testing/isissue/27#issuecomment-219074863



0

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


0

Тестовий клас може бути виключений із збірки. Виправити це в налаштування-компілятор-виключити.


0

Ось мої кроки налагодження, які я проходжу, коли Android Studio раптом вирішує припинити виконання тестів / налагодження (І хлопчик це трапляється бездоганно часто !!):

  • Побудова: → Проект відновлення
  • Перезапустити пристрій: перезавантажте свій пристрій / емулятор і повторіть спробу
  • Перемикач пристроїв: якщо у вас є звичайний телефон і емулятор, відключіть його від мережі та спробуйте запустити його лише одним із пристроїв
  • Android Studio: Файл -> Недійсний кеш і перезапуск
  • Монітор діяльності / диспетчер завдань: сортуйте процеси за назвою, подивіться, чи є безіменні процеси, які використовують багато оперативної пам’яті, це процес «привид» від студії Android, який потрібно вбити
  • git revert: спробуйте зберігати / скасовувати останній код. Іноді виникає помилка компіляції, яка пропускає Android Studio / gradle, і вона просто намагатиметься запустити невідкладений код.
  • Видаліть та перевстановіть Android Studio.

Я додам більше виправлень, коли натрапляю на них!


0

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


0

В Android-студії зі спок-фреймом я змінив версію свого градуса з 2.2.2 на 3.2.1 і все йде добре.


0

Отримана відповідь не вирішила моєї проблеми. Тому я вирішив скопіювати ExampleInstrumentedTestстворене за замовчуванням в Android Studio і працює без проблем, перейменував його під час копіювання (немає Refactor-> Перейменувати після копіювання!) Та вставив у нього вміст мого тесту. Після цього помилка зникла.


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 ... дозволило мені виконати одиничні тести.


0

Я робив кілька вставок у db у методі @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

Це сталося зі мною, коли я помилково позначив змінну non mock класом із приміткою. @Mock Видалено примітку та тести пройшли успішно. Це сталося з Junit 4.5 на Android Studio


0

Це не рішення, а рішення, яке швидко поверне вас назад:

  1. По-перше, знайдіть тест, який працює. Я писав новий тест, де отримав помилку "порожній тестовий набір". Я проводив інші тести, і вони працювали як завжди.

  2. Скопіюйте тестовий файл, який працює. Запустіть його, щоб переконатися, що ця копія працює як оригінал.

  3. Вийміть корпус і замініть його новим тестовим кодом.

Тепер тест має працювати.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.