Инструментальные тесты в Android Studio

Я безуспешно пытался запустить простые инструментальные тесты в Android Studio. Я следовал руководству по модульным тестам, и оно работает отлично. Теперь я хотел бы протестировать компоненты, над которыми сложно имитировать. Когда я следую руководству по инструментальным тестам, Я получаю ошибки зависимости.

Что я сделал:

  • Установите библиотеку поддержки тестирования Android (репозиторий поддержки Android, версия 17).

  • Создайте каталог androidTest в src. Добавьте папку Java + пакет, заканчивающийся на "test".

  • Добавить простой тестовый класс
 @RunWith(AndroidJUnit4.class)
    public class ServerRequestInstrumentationTest {
        @Test
        public void test(){
           LogC.d("Here we go testing !");
        }
    }
  • Добавьте простой TestSuit.
@RunWith(Suite.class)
@Suite.SuiteClasses({ServerRequestInstrumentationTest.class})
public class TestSuit {

    public TestSuit(){}
}
  • Измените мой файл gradle, чтобы добавить зависимости.
apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.mydomain.app"
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 28
        versionName "2.0.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            lintOptions {
                disable 'MissingTranslation'
            }
        }
    }
    sourceSets { main { java.srcDirs = ['src/main/java'] } }
}

dependencies {
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    wearApp project(':wear')
    compile project(':moreapps')
    compile project(':lib_repair')
    compile project(':bugreport')
    //testCompile 'junit:junit:4.12'
    testCompile 'org.mockito:mockito-core:1.10.19'
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.1'
    androidTestCompile 'com.android.support.test:runner:0.3'
    androidTestCompile 'com.android.support.test:rules:0.3'
}

Я просто добавил строку androidTestCompile 'junit:junit:4.12', иначе аннотация @RunWith(AndroidJUnit4.class) не распознавалась. Теперь, когда я запускаю тест, я получаю одну ошибку сборки Gradle.

Ошибка: не удалось выполнить задачу ': app: dexDebugAndroidTest'.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: команда процесса / usr / lib / jvm / jdkoracle / bin / java завершена с ненулевым значением выхода 2

Любое предложение ? Я что-то пропустил в библиотеке тестирования?

Спасибо


person Gordak    schedule 02.09.2015    source источник


Ответы (4)


Хорошо, наконец-то он заработал.

После небольшого поиска я обнаружил, что консоль Gradle выдает ошибку:

AGPBI: {"kind":"simple","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","sources":[{}]}
AGPBI: {"kind":"simple","text":"com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/TypeSafeMatcher;","sources":[{}]}

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

Строка для изменения:

androidTestCompile 'org.hamcrest:hamcrest-library:1.1'

to

testCompile 'org.hamcrest:hamcrest-library:1.1'

Я не знаю, почему Gradle жалуется в одном случае, а не в другом ...

person Gordak    schedule 03.09.2015

Инструментальные тесты отличаются от модульных тестов. Вы должны расширить свои тестовые классы определенными классами. Для получения дополнительной информации см. основы тестирования Android. Также вам не нужен JUnit для тестов Instrumentaion.

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

ПРИМЕР:

Вот пример инструментального теста в android:

public class ExampleITest extends AndroidTestCase {

  @Override
  public void setUp() throws Exception {
    super.setUp();
    InputStream is = getContext().getAssets().open("test.xml");
    XmlParser parser = new XmlParser(getContext());
    parser.parse(is);
    ...
  }

  @MediumTest
  public void testSomething() throws Exception {      
    // test some data your parser extracted from the xml file
    ...
  }
}

Как видите, у вас есть доступ к контексту и т. Д. Для этого теста в файле gradle не требуются какие-либо конкретные зависимости.

Я не слышал о тестах Instrumantation только с аннотациями. может мне стоит поискать это в сети;)

person Rich    schedule 02.09.2015
comment
Привет. Да, я установил Test Artifact в Android Instrumentation Tests. На самом деле, я не уверен, что основы тестирования Android обновлены, поскольку я могу читать. Обратите внимание, что API тестирования Android поддерживает стиль кода JUnit 3, но не JUnit 4., хотя Android Testing, похоже, поддерживает JUnit 4. обновленная среда тестирования, похоже, больше использует аннотации, а не классы. - person Gordak; 02.09.2015
comment
да, это может быть немного устаревшим, но я думаю, что основы все те же. Я обновил свой пост небольшим примером. - person Rich; 02.09.2015
comment
Мне нужна помощь с написанием инструментального теста. Я установил тестовый артефакт, как вы написали. Моя проблема в том, что, хотя при запуске тестовых отчетов нет ошибок, Android Studio не находит мой тест в тестовом классе. Я задал вопрос на stackoverflow.com/questions/35426990/ - person Monica; 17.02.2016

Хотя ответ @Gordark не вызовет никаких ошибок. Это неправильное решение, если вы хотите использовать Hamcrest в своих инструментальных тестах, оно будет работать только для ваших локальных тестов JVM.

Я обнаружил, что использование библиотеки hamcrest версии 1.3 действительно работает, просто замените

androidTestCompile 'org.hamcrest:hamcrest-library:1.1'

с участием

androidTestCompile 'org.hamcrest:hamcrest-library:1.3'

И это должно работать. Думаю, дело в конфликтующих версиях junit и hamcrest. Я предполагаю, что hamcrest 1.1 зависит от версии junit ниже 4.12, а hamcrest 1.3 зависит от junit v4.12.

person Shyri    schedule 19.12.2015
comment
Обратите внимание, что корень проблемы в том, что одна из других зависимостей требует hamcrest. Удаление явной зависимости hamcrest позволяет автоматически использовать правильную версию. - person Code-Apprentice; 10.02.2016

Ваш ответ содержит намек на проблему. Вы утверждаете, что Gradle выдает ошибку. Это потому, что одна из других зависимостей для androidTestCompile зависит от hamcrest. Это называется транзитивной зависимостью. Это также означает, что вы можете полностью удалить свое явное требование для hamcrest. Ваше изменение добавляет hamcrest в качестве зависимости для testCompile, который используется для модульных тестов, запускаемых локально на вашей машине разработки, а не на устройстве Android или эмуляторе. Если вы не проводите модульные тесты, вам это не нужно. Даже когда вы начинаете писать модульные тесты, вам, вероятно, не нужна явная зависимость от hamcrest.

person Code-Apprentice    schedule 10.02.2016