Запуск тестов Espresso на Android 4.4?

Я пытаюсь перевести наше приложение на использование Espresso для тестирования пользовательского интерфейса, но я не могу заставить Gradle найти мои тесты на устройстве под управлением Android 4.4 (API 19, наша минимальная цель развертывания). Тесты на Android 6.0 (API 23) проходят нормально. Я добавил средство запуска JUnit и зависимости к app/build.gradle в соответствии с это и это ( Я исключил аннотации из-за конфликта версий между модулями):

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

dependencies {
...
    androidTestCompile("com.android.support.test.espresso:espresso-core:2.2.2") {
        exclude module: 'support-annotations'
    }
    androidTestCompile("com.android.support.test:runner:0.5") {
        exclude module: 'support-annotations'
    }
    androidTestCompile("com.android.support.test:rules:0.5") {
        exclude module: 'support-annotations'
    }
}

Затем я создал необходимую структуру каталогов app/src/androidTest/java/, пакет com.companyname.appname и класс Java EspressoTest.java с некоторым тестовым кодом:

@RunWith(AndroidJUnit4.class)
public class EspressoTest {

    @Rule
    public ActivityTestRule<TermsOfUse> termsOfUseActivityTestRule = new ActivityTestRule<>(TermsOfUse.class);

    @Test
    public void iAmAtTouView() {
        onView(withId(R.id.terms_of_use_content)).check(matches(isDisplayed()));
    }
}

Если я щелкну правой кнопкой мыши тестовый класс EspressoTest и выберу «Запустить EspressoTest», я получу сообщение об ошибке:

$ adb shell am instrument -w -r   -e package com.companyname.appname -e debug false com.companyname.appname.qa.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Test running failed: Instrumentation run failed due to 'Process crashed.'
Empty test suite.

Также, если я ввожу ./gradlew connectedAndroidTest в командную строку, я получаю:

Starting 0 tests on GT-I9305 - 4.4.4
Tests on GT-I9305 - 4.4.4 failed: Instrumentation run failed due to 'Process crashed.'

com.android.builder.testing.ConnectedDevice > No tests found.[GT-I9305 - 4.4.4] FAILED 
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).
:app:connectedAuditDebugAndroidTest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:connectedAuditDebugAndroidTest'.
> There were failing tests. See the report at: 
...

Поэтому мне кажется, что Gradle не распознает мой тестовый класс при попытке выполнить тестовые задачи на устройстве Android. Как я могу это исправить?


person Julsteri    schedule 11.05.2017    source источник
comment
Вы смогли решить проблему?   -  person Shadab Ansari    schedule 07.03.2018


Ответы (3)


Был ли шанс, что вам пришлось включить multidex, потому что ваш *-androidTest.apk содержал более 64 тысяч методов?

Если это так, вам нужно убедиться, что первый файл dex (classes.dex) содержит все *Test классы, которые вы хотите запустить. Вы можете настроить это следующим образом:

android {
    defaultConfig {
        multiDexEnabled true
        multiDexKeepProguard file('multidex-config.pro')
    }
}

и в вашем multidex-config.pro вы добавляете обычные -keep правила для своих тестовых классов, например.

-keep class path.to.my.package.**.*Test { *; }

Если ваши тестовые классы имеют зависимости за пределами вашего собственного пути к пакету, обязательно включите их в отдельные операторы -keep. Ищите java.lang.ClassNotFoundException в adb logcat, чтобы определить недостающие классы.

person Thomas Keller    schedule 04.03.2019

Сначала проверьте, какие задачи доступны для запуска gradle:

gradle <app-module>:tasks

or

gradle --gui

Посмотрите, есть ли выполняемая вами задача в списке задач. Также какую машину вы пытаетесь запустить: MacOS или Windows? Всегда запускайте gradle с помощью «sudo», если нет, по крайней мере, синхронизируйте свой проект из студии Android, это всегда хорошая идея перед запуском тестов.

person testsingh    schedule 16.05.2017
comment
Задача находится в списке, и, как вы можете видеть из вывода консоли, который я опубликовал, она запускается Gradle. В противном случае я бы получил исключение о том, что задача не найдена. Я работаю в Mac OS и никогда ничего не запускаю с помощью sudo, если это явно не требуется интерфейсом. - person Julsteri; 17.05.2017
comment
Убейте свою Android Studio, а затем снова откройте ее и попробуйте запустить. Просто попробуйте - person testsingh; 17.05.2017
comment
Я отредактировал исходный пост, чтобы уточнить, что тесты не проходят на Android 4.4, а не на 6.0. - person Julsteri; 18.05.2017
comment
Да, такое бывает. Вы пробовали запускать тесты с аннотациями @Test или без них? также, когда вы добавляете или удаляете, всегда очищайте gradle, а затем запускайте тесты. Попробуй это - person testsingh; 18.05.2017

Добавлена ​​дополнительная информация для ответа Томаса Келлера:

-keep path.to.my.package.**.*Test { *; }

имеет синтаксическую ошибку, должно быть:

-keep class path.to.my.package.**.*Test { *; }

Согласно руководству Android:

https://developer.android.com/studio/build/multidex?#multidexkeepproguard-property

Это сработало для меня. Я запускаю инструментальный тест на Android 4.4.

Когда я нашел ключевое сообщение в logcat о том, что средство запуска теста ищет путь к классам только в основном пути DEX, даже если вторичный dex уже обработан androidx.multidex.

D/dalvikvm( 7758): DexOpt: --- END 'com.byted.bytexx.test-1.apk.classes2.zip' (success) ---
D/dalvikvm( 7758): DEX prep '/data/data/com.byted.bytexx.test/code_cache/secondary-dexes/com.byted.bytexx.test-1.apk.classes2.zip': unzip in 109ms, rewrite 1745ms
I/MultiDex( 7758): install done
I/MonitoringInstr( 7758): Instrumentation started!
I/MultiDex( 7758): Installing instrumentation
I/MultiDex( 7758): Installation done

...

I/TestRequestBuilder( 7758): Scanning classpath to find tests in paths [/data/app/com.byted.bytexx.test-1.apk]

...

D/TestExecutor( 7758): Adding listener androidx.test.internal.runner.listener.ActivityFinisherRunListener
I/TestRunner( 7758): run started: 1 tests
I/TestRunner( 7758): run finished: 0 tests, 0 failed, 0 ignored
I/MonitoringInstr( 7758): waitForActivitiesToComplete() took: 0ms
D/AndroidRuntime( 7741): Shutting down VM

И я обнаружил, что моего тестового кода нет в основной DEX.

person 张小贤    schedule 09.03.2021