Zaawansowana konfiguracja testu

Testowanie w Android Studio i Testowanie z poziomu wiersza poleceń wyjaśniają, jak skonfigurować i uruchomić podstawowe konfiguracje testów. Gdy jednak Twoja aplikacja i jej wymagania testowe staną się bardziej zaawansowane, może być konieczne dalsze dostosowanie konfiguracji testów. Zaawansowana konfiguracja testów może być potrzebna np. w tych przypadkach:

  • Uruchamianie testów instrumentacyjnych tylko w przypadku określonego wariantu kompilacji lub zastępowanie jego ustawień manifestu.
  • Zmienianie rodzaju kompilacji, w przypadku którego uruchamiane są testy, lub konfigurowanie jego opcji Gradle.
  • Wyodrębnianie testów instrumentacyjnych do osobnego modułu testowego.
  • Przeprowadzanie bardziej zaawansowanych testów w ramach konfiguracji ciągłej integracji.

Na tej stronie opisujemy różne sposoby konfigurowania testów, gdy ustawienia domyślne nie spełniają Twoich potrzeb.

Tworzenie testu instrumentacyjnego dla wariantu kompilacji

Jeśli Twój projekt zawiera warianty kompilacji z unikalnymi zestawami źródeł, możesz uwzględnić testy instrumentacyjne, które odpowiadają tym zestawom źródeł. Dzięki temu kod testowy jest uporządkowany i możesz uruchamiać tylko testy, które dotyczą danego wariantu kompilacji.

Aby połączyć testy instrumentacyjne z wariantem kompilacji, umieść je w osobnym zestawie źródeł znajdującym się w src/androidTestVariantName.

Testy instrumentacyjne w zestawie źródeł src/androidTest/ są współdzielone przez wszystkie warianty kompilacji. Podczas tworzenia testowego pliku APK dla wariantu „MyFlavor” Twojej aplikacji Gradle łączy zestawy źródeł src/androidTest/ i src/androidTestMyFlavor/.

Aby dodać zbiór źródeł testowych dla wariantu kompilacji w Android Studio, wykonaj następujące kroki:

  1. W oknie Projekt kliknij menu i wybierz widok Projekt.
  2. W odpowiednim folderze modułu kliknij prawym przyciskiem myszy folder src i kliknij Nowy > Katalog.
  3. Jako nazwę katalogu wpisz „androidTestVariantName”. Jeśli na przykład masz wariant kompilacji o nazwie „MyFlavor”, użyj nazwy katalogu androidTestMyFlavor.
  4. Kliknij OK.
  5. Kliknij prawym przyciskiem myszy nowy katalog i wybierz Nowy > Katalog.
  6. Jako nazwę katalogu wpisz „java”, a potem kliknij OK.

Teraz możesz dodać testy do tego nowego zbioru źródeł, wykonując czynności opisane w artykule Dodawanie nowego testu. Gdy pojawi się okno Wybierz katalog docelowy, wybierz nowy zbiór źródeł testowych wariantu.

W tabeli poniżej znajdziesz przykład tego, jak pliki testów z instrumentacją mogą znajdować się w zbiorach źródeł odpowiadających zbiorom źródeł kodu aplikacji:

Tabela 1. Kod źródłowy aplikacji i odpowiadające mu pliki testów z instrumentacją

Ścieżka do klasy aplikacji Ścieżka do pasującej klasy testów instrumentacyjnych
src/main/kotlin+java/Example.kt src/androidTest/java/AndroidExampleTest.kt
src/myFlavor/kotlin+java/Example.kt src/androidTestMyFlavor/java/AndroidExampleTest.kt

Podobnie jak w przypadku zestawów źródeł aplikacji, kompilacja Gradle scala i zastępuje pliki z różnych zestawów źródeł testowych. W tym przypadku plik AndroidExampleTest.kt w zestawie źródeł androidTestMyFlavor zastępuje wersję w zestawie źródeł androidTest. Dzieje się tak, ponieważ zestaw źródeł wariantu produktu ma priorytet przed głównym zestawem źródeł.

Gdy w selektorze wariantów kompilacji wybierzesz różne warianty, w widoku Android zostaną wyświetlone odpowiednie foldery androidTest, aby pokazać foldery, które są używane:

Wybrana odmiana MyFlavor, a w widoku Androida widoczny jest folder androidTestMyFlavor
Rysunek 1. Wybrany wariant MyFlavor; folder androidTestMyFlavor jest wyświetlany w widoku Android.

Gdy wybierzesz inny wariant, folder androidTestMyFlavor nie będzie widoczny:

Wybrano wariant OtherFlavor, a folder androidTestMyFlavor nie jest widoczny w widoku Androida
Rysunek 2. Wybrany wariant OtherFlavor; folder androidTestMyFlavor nie jest wyświetlany w widoku Android.

Jeśli używasz widoku Projekt , wygląda to nieco inaczej, ale obowiązuje ta sama zasada:

Wybrany wariant MyFlavor, a folder androidTestMyFlavor jest aktywny w widoku projektu
Rysunek 3. Wybrany wariant MyFlavor; folder androidTestMyFlavor jest aktywny w widoku Projekt.

Gdy wybierzesz inny wariant, folder androidTestMyFlavor będzie nadal widoczny, ale nie będzie oznaczony jako aktywny:

Wybrano wariant OtherFlavor, a folder androidTestMyFlavor nie jest aktywny w widoku projektu
Rysunek 4. Wybrany wariant OtherFlavor; folder androidTestMyFlavor nie jest aktywny w widoku Projekt.

Więcej informacji o scalaniu zestawów źródeł znajdziesz w artykule Zestawy źródeł.

Konfigurowanie ustawień manifestu instrumentacji

Testy instrumentacyjne są wbudowane w osobny plik APK z własnym plikiem AndroidManifest.xml. Gdy Gradle tworzy testowy plik APK, automatycznie generuje plik AndroidManifest.xml i konfiguruje go za pomocą węzła <instrumentation>. Jednym z powodów, dla których Gradle konfiguruje ten węzeł, jest upewnienie się, że właściwość targetPackage określa prawidłową nazwę pakietu testowanej aplikacji.

Aby zmienić inne ustawienia tego węzła, utwórz kolejny plik manifestu w zestawie źródeł testowych lub skonfiguruj plik build.gradle na poziomie modułu, jak pokazano w tym przykładowym kodzie. Pełną listę opcji znajdziesz w BaseFlavor dokumentacji API.

Kotlin

android {
    ...
    defaultConfig {
        ...
        testApplicationId = "com.example.test"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling = true
        testFunctionalTest = true
    }
}

Dynamiczny

android {
    ...
    defaultConfig {
        ...
        testApplicationId "com.example.test"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling true
        testFunctionalTest true
    }
}

Każdy skonfigurowany wariant produktu może zastępować właściwości w bloku defaultConfig {}. Więcej informacji znajdziesz w artykule Konfigurowanie wariantów produktu.

Właściwości w tym fragmencie kodu to:

Ustawienie Opis
testApplicationId Określa identyfikator aplikacji dla testowego pliku APK.
testInstrumentationRunner Określa pełną i jednoznaczną nazwę klasy narzędzia do uruchamiania testów instrumentacyjnych.
testHandleProfiling Jeśli ustawisz wartość true, klasa instrumentacji będzie mogła rozpoczynać i zatrzymywać profilowanie.
Jeśli ustawisz wartość false, profilowanie będzie się odbywać przez cały czas działania klasy instrumentacji.
testFunctionalTest Jeśli ustawisz wartość true, system Android będzie uruchamiał klasę instrumentacji jako test funkcjonalny test.
Wartość domyślna to false.

Zmienianie rodzaju kompilacji testowej

Domyślnie wszystkie testy z instrumentacją są uruchamiane w przypadku rodzaju kompilacji debug. Możesz to zmienić na inny rodzaj kompilacji, używając właściwości testBuildType w pliku build.gradle na poziomie modułu. Jeśli na przykład chcesz uruchamiać testy w przypadku rodzaju kompilacji staging, edytuj plik tak jak w tym fragmencie kodu:

Kotlin

android {
    ...
    testBuildType = "staging"
}

Dynamiczny

android {
    ...
    testBuildType "staging"
}

Konfigurowanie opcji testów Gradle

Wtyczka Android Gradle umożliwia określanie niektórych opcji dla wszystkich lub tylko niektórych testów. W pliku na poziomie modułu użyj bloku, aby określić opcje, które zmieniają sposób uruchamiania wszystkich testów przez Gradle:build.gradletestOptions

Kotlin

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir = "$rootDir/test-reports"
        resultsDir = "$rootDir/test-results"
    }
}

Dynamiczny

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir "$rootDir/test-reports"
        resultsDir "$rootDir/test-results"
    }
}

Właściwość reportDir zmienia katalog, w którym Gradle zapisuje raporty z testów. Domyślnie Gradle zapisuje raporty z testów w katalogu path_to_your_project/module_name /build/outputs/reports/. $rootDir ustawia ścieżkę względną do katalogu głównego bieżącego projektu.

Właściwość resultsDir zmienia katalog, w którym Gradle zapisuje wyniki testów. Domyślnie Gradle zapisuje wyniki testów w katalogu path_to_your_project/module_name /build/outputs/test-results/. $rootDir ustawia ścieżkę względną do katalogu głównego bieżącego projektu.

Aby określić opcje tylko dla lokalnych testów jednostkowych, skonfiguruj unitTests blok w testOptions.

Kotlin

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues = true

            all {
                jvmArgs = listOf("-XX:MaxPermSize=256m")

                 if (it.name == "testDebugUnitTest") {
                    systemProperty = mapOf("debug" to "true")
                }
                ...
            }
        }
    }
}

Dynamiczny

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues true

            all {
                jvmArgs '-XX:MaxPermSize=256m'

                if (it.name == 'testDebugUnitTest') {
                    systemProperty 'debug', 'true'
                }
                ...
            }
        }
    }
}

Domyślnie lokalne testy jednostkowe zgłaszają wyjątek za każdym razem, gdy kod testowany próbuje uzyskać dostęp do interfejsów API platformy Android, chyba że samodzielnie lub za pomocą platformy testowej, takiej jak Mockito, utworzysz mocki zależności Androida. Możesz jednak włączyć właściwość returnDefaultValues, aby test zwracał wartość null lub zero podczas uzyskiwania dostępu do interfejsów API platformy, zamiast zgłaszać wyjątek.

Blok all zawiera opcje sterowania sposobem wykonywania lokalnych testów jednostkowych przez Gradle. Listę wszystkich opcji, które możesz określić, znajdziesz w dokumentacji referencyjnej Gradle.

Właściwość jvmArgs ustawia argumenty JVM dla testowych maszyn JVM.

Możesz też sprawdzić nazwę zadania, aby zastosować opcje tylko do określonych testów. W przykładowym fragmencie kodu właściwość debug jest ustawiona na true, ale tylko w przypadku zadania testDebugUnitTest.

Używanie osobnych modułów testowych do testów instrumentacyjnych

Jeśli chcesz mieć osobny moduł do testów instrumentacyjnych, aby odizolować resztę kodu od testów, utwórz osobny moduł testowy i skonfiguruj jego kompilację podobnie jak w przypadku modułu biblioteki.

Aby utworzyć moduł testowy:

  1. Utwórz moduł biblioteki.
  2. W pliku build.gradle na poziomie modułu zastosuj wtyczkę com.android.test zamiast com.android.library.
  3. Kliknij Synchronizuj projekt .

Po utworzeniu modułu testowego możesz umieścić kod testowy w głównym zestawie źródeł lub w zestawie źródeł wariantu (np. src/main/kotlin+java lub src/variant/kotlin+java). Jeśli moduł aplikacji definiuje wiele wariantów produktu, możesz je odtworzyć w module testowym . Dzięki zarządzaniu zależnościami uwzględniającemu warianty, moduł testowy próbuje przetestować pasujący wariant w module docelowym.

Domyślnie moduły testowe zawierają i testują tylko wariant debugowania. Możesz jednak utworzyć nowe typy kompilacji, które będą pasować do testowanego projektu aplikacji. Aby moduł testowy testował inny rodzaj kompilacji niż debugowanie, użyj VariantFilter, aby wyłączyć wariant debugowania w projekcie testowym, jak pokazano poniżej:

Kotlin

android {
    variantFilter {
        if (buildType.name == "debug") {
            ignore = true
        }
    }
}

Dynamiczny

android {
    variantFilter { variant ->
        if (variant.buildType.name.equals('debug')) {
            variant.setIgnore(true);
        }
    }
}

Jeśli chcesz, aby moduł testowy był kierowany tylko na określone warianty lub typy kompilacji aplikacji, możesz użyć właściwości matchingFallbacks, aby kierować reklamy tylko na warianty, które chcesz testować. Dzięki temu moduł testowy nie musi samodzielnie konfigurować tych wariantów.