Тесты не найдены при использовании пользовательского бегуна

Я использую androidx.test библиотеки (которые я недавно перенес) в моем проекте и с использованием пользовательских AndroidJUnitRunner, До миграции все работало нормально, но теперь я получаю эту ошибку -

Started running tests Test running failed: Instrumentation run failed due to 'Process crashed.' Empty test suite.

Пользовательский класс бегуна, который я использую, простирается от androidx.test.runner.AndroidJUnitRunner

В моем приложении build.gradle файл у меня есть следующие настройки -

testInstrumentationRunner "com.example.CustomTestRunner"

с зависимостями -

androidTestImplementation "androidx.test.ext:junit:1.1.0" androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test:core:1.1.0' androidTestImplementation "androidx.test:rules:1.1.1"

Все мои тестовые занятия @RunWith(androidx.test.ext.junit.runners.AndroidJUnit4.class)

Я застрял в этом. Любая помощь будет оценена. Благодарю.

4 ответа

Я видел это во время тестирования с использованием Android 4.4. Когда я переключился на Android 6 (SDK 23), проблема исчезла.

Я использовал androidx.test.ext.junit.runners.AndroidJUnit4 для своих инструментальных тестов @RunWith(AndroidJunit4.class)

но мой testInstrumentationRunner использует пакет:

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

Смешивание двух разных пакетов кажется странным, но это работает.

мое приложение /build.gradle имеет:

android {
    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    testOptions { 
        execution 'ANDROIDX_TEST_ORCHESTRATOR'
        unitTests {
            includeAndroidResources = true
        }
    }

    useLibrary 'android.test.runner'
    useLibrary 'android.test.base'
    useLibrary 'android.test.mock'
}

dependencies {
    //--------------------------------------------------------------------------------
    // Test Dependencies

    // Required -- JUnit 4 framework for standard unit tests.
    testImplementation "junit:junit:$rootProject.ext.junitVersion"

    androidTestImplementation "junit:junit:$rootProject.ext.junitVersion"
    androidTestImplementation "org.hamcrest:hamcrest-library:$rootProject.ext.hamcrestVersion"

    // Mockito framework for NMEA-parser unit tests.
    testImplementation "org.mockito:mockito-core:$rootProject.ext.mockitoVersion"

    // Room testing
    androidTestImplementation "androidx.room:room-testing:$rootProject.ext.roomVersion"

    // Core library
    androidTestImplementation "androidx.test:core:$rootProject.ext.testCoreVersion"
    androidTestImplementation "androidx.arch.core:core-testing:$rootProject.ext.coreVersion"

    // AndroidJUnitRunner and JUnit Rules
    // deprecated
    androidTestImplementation "androidx.test:runner:$rootProject.ext.runnerVersion"
    androidTestImplementation "androidx.test:rules:$rootProject.ext.rulesVersion"

    // Assertions
    androidTestImplementation "androidx.test.ext:junit:$rootProject.ext.junitRunnerVersion"
    androidTestUtil "androidx.test:orchestrator:$rootProject.ext.orchestratorVersion"

//    androidTestImplementation "androidx.test.ext:truth:$rootProject.ext.xTruthVersion"
//    androidTestImplementation "com.google.truth:truth:$rootProject.ext.truthVersion"

    // Espresso dependencies
//    androidTestImplementation "androidx.test.espresso:espresso-core:$rootProject.ext.espressoVersion"
//    androidTestImplementation "androidx.test.espresso:espresso-contrib:$rootProject.ext.espressoVersion"
//    androidTestImplementation "androidx.test.espresso:espresso-intents:$rootProject.ext.espressoVersion"
//    androidTestImplementation "androidx.test.espresso:espresso-accessibility:$rootProject.ext.espressoVersion"
//    androidTestImplementation "androidx.test.espresso:espresso-web:$rootProject.ext.espressoVersion"
//    androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$rootProject.ext.espressoVersion"
//    androidTestImplementation "androidx.test.espresso:espresso-idling-resource:$rootProject.ext.espressoVersion"
}

configurations {
    all {
        resolutionStrategy {
            force "androidx.recyclerview:recyclerview:$rootProject.ext.recyclerviewVersion"
            force "org.checkerframework:checker-qual:$rootProject.ext.checkerQualVersion"
            force "org.checkerframework:checker-compat-qual:$rootProject.ext.checkerQualVersion"
            force "com.google.errorprone:error_prone_annotations:$rootProject.ext.errorProneAnnotationsVersion"
        }
    }
}

and I have these library versions:

        // Core Test library
        testCoreVersion = '1.1.0'
        coreVersion = '2.0.0-alpha1'

        // Automated Test Libraries
        // Instrumentation Test Runner
        junitRunnerVersion = '1.1.0'
        runnerVersion = '1.1.1'
        rulesVersion = '1.1.1'
        xTruthVersion = '1.0.0'
        truthVersion = '0.42'
        espressoVersion = '3.1.0'
        hamcrestVersion = '1.3'
        orchestratorVersion = '1.1.0'

        // JUnit library version
        junitVersion = '4.12'

        // Mockito version
        mockitoVersion = '2.21.0'

        // Force testing dependencies
        recyclerviewVersion = '1.0.0'
        checkerQualVersion = '2.5.3'
        errorProneAnnotationsVersion = '2.3.1'

Я столкнулся с той же проблемой при использовании настраиваемого класса Runner для использования настраиваемого класса Application.

Что случилось:

Моя проблема заключалась в том, что я передавал только имя класса, а не имя пакета +.

Неправильно:

package com.teebalhoor.oredoh

import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner

/**
 * Created by Muhammad Maqsood on 13/09/2020.
 */
class CustomTestRunner : AndroidJUnitRunner() {

override fun newApplication(
    cl: ClassLoader?,
    className: String?,
    context: Context?
): Application {

    return super.newApplication(cl, OredohTestApplication::class.java.simpleName, context)
}
}

Правильно:

package com.teebalhoor.oredoh

import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner

/**
 * Created by Muhammad Maqsood on 13/09/2020.
 */
class CustomTestRunner : AndroidJUnitRunner() {

override fun newApplication(
    cl: ClassLoader?,
    className: String?,
    context: Context?
): Application {

    return super.newApplication(cl, OredohTestApplication::class.java.canonicalName, context)
}
}

Работало нормально, когда я заменил (Дайте только имя)

OredohTestApplication::class.java.simpleName

с (указать пакет + имя)

OredohTestApplication::class.java.canonicalName 

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

Сделав это, трассировка стека была сохранена, и мы могли видеть, что наш фальшивый/тестовый график Dagger2 инициализировался неправильно, и приложение аварийно завершало работу, прежде чем какие-либо тесты могли быть запущены.

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

Одна из возможных причин - старые приложения Test Orchestrator (orchestrator-1.1.1.apk) или Test Services (test-services-1.1.1.apk), которые были созданы для компонентов библиотеки поддержки Android и по-прежнему установлены на целевом устройстве. Откройте Настройки -> Все приложения, найдите их и удалите. При повторном запуске тестов из Android Studio будут установлены новые приложения, созданные для AndroidX, и ваша проблема может исчезнуть.

Другие вопросы по тегам