Создание инструментальных тестов

Инструментальные тесты выполняются на устройствах Android, физических или эмулируемых. Таким образом, они могут воспользоваться API-интерфейсами платформы Android. Таким образом, инструментальные тесты обеспечивают большую точность, чем локальные тесты, хотя они выполняются гораздо медленнее.

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

Настройте среду тестирования

В проекте Android Studio вы храните исходные файлы для инструментальных тестов в module-name/src/androidTest/java/ . Этот каталог уже существует, когда вы создаете новый проект, и содержит пример инструментированного теста.

Прежде чем начать, вам следует добавить тестовые API AndroidX, которые позволят вам быстро создавать и запускать инструментированный тестовый код для ваших приложений. AndroidX Test включает средство запуска тестов JUnit 4, AndroidJUnitRunner и API для функциональных тестов пользовательского интерфейса, таких как Espresso , UI Automator и Compose test .

Вам также необходимо настроить зависимости тестирования Android для вашего проекта, чтобы использовать средство выполнения тестов и API-интерфейсы правил, предоставляемые AndroidX Test.

В файле build.gradle верхнего уровня вашего приложения вам необходимо указать эти библиотеки в качестве зависимостей:

dependencies {
    androidTestImplementation "androidx.test:runner:$androidXTestVersion"
    androidTestImplementation "androidx.test:rules:$androidXTestVersion"
    // Optional -- UI testing with Espresso
    androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
    // Optional -- UI testing with UI Automator
    androidTestImplementation "androidx.test.uiautomator:uiautomator:$uiAutomatorVersion"
    // Optional -- UI testing with Compose
    androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
}

Последние версии можно найти в примечаниях к выпуску AndroidX и примечаниях к выпуску Compose UI .

Чтобы использовать тестовые классы JUnit 4 и иметь доступ к таким функциям, как фильтрация тестов, обязательно укажите AndroidJUnitRunner в качестве средства запуска инструментов тестирования по умолчанию в вашем проекте, включив следующий параметр в файл build.gradle на уровне модуля вашего приложения:

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

Создайте класс инструментированного тестирования.

Ваш инструментированный тестовый класс должен быть тестовым классом JUnit 4, похожим на класс, описанный в разделе о создании локальных тестов .

Чтобы создать инструментированный класс тестов JUnit 4, укажите AndroidJUnit4 в качестве средства запуска тестов по умолчанию.

В следующем примере показано, как можно написать инструментированный тест для проверки правильности реализации интерфейса Parcelable для класса LogHistory :

Котлин

import android.os.Parcel
import android.text.TextUtils.writeToParcel
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

const val TEST_STRING = "This is a string"
const val TEST_LONG = 12345678L

// @RunWith is required only if you use a mix of JUnit3 and JUnit4.
@RunWith(AndroidJUnit4::class)
@SmallTest
class LogHistoryAndroidUnitTest {
    private lateinit var logHistory: LogHistory

    @Before
    fun createLogHistory() {
        logHistory = LogHistory()
    }

    @Test
    fun logHistory_ParcelableWriteRead() {
        val parcel = Parcel.obtain()
        logHistory.apply {
            // Set up the Parcelable object to send and receive.
            addEntry(TEST_STRING, TEST_LONG)

            // Write the data.
            writeToParcel(parcel, describeContents())
        }

        // After you're done with writing, you need to reset the parcel for reading.
        parcel.setDataPosition(0)

        // Read the data.
        val createdFromParcel: LogHistory = LogHistory.CREATOR.createFromParcel(parcel)
        createdFromParcel.getData().also { createdFromParcelData: List<Pair<String, Long>> ->

            // Verify that the received data is correct.
            assertThat(createdFromParcelData.size).isEqualTo(1)
            assertThat(createdFromParcelData[0].first).isEqualTo(TEST_STRING)
            assertThat(createdFromParcelData[0].second).isEqualTo(TEST_LONG)
        }
    }
}

Ява

import android.os.Parcel;
import android.util.Pair;
import androidx.test.runner.AndroidJUnit4;
import com.google.common.truth.Truth.assertThat;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith is required only if you use a mix of JUnit3 and JUnit4.
@RunWith(AndroidJUnit4.class)
public class LogHistoryAndroidUnitTest {

    public static final String TEST_STRING = "This is a string";
    public static final long TEST_LONG = 12345678L;
    private LogHistory mLogHistory;

    @Before
    public void createLogHistory() {
        mLogHistory = new LogHistory();
    }

    @Test
    public void logHistory_ParcelableWriteRead() {
        // Set up the Parcelable object to send and receive.
        mLogHistory.addEntry(TEST_STRING, TEST_LONG);

        // Write the data.
        Parcel parcel = Parcel.obtain();
        mLogHistory.writeToParcel(parcel, mLogHistory.describeContents());

        // After you're done with writing, you need to reset the parcel for reading.
        parcel.setDataPosition(0);

        // Read the data.
        LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel);
        List<Pair<String, Long>> createdFromParcelData
                = createdFromParcel.getData();

        // Verify that the received data is correct.
        assertThat(createdFromParcelData.size()).isEqualTo(1);
        assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING);
        assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG);
    }
}

Запустите инструментальные тесты

Инструментальные тесты можно запускать на реальных устройствах или в эмуляторах. В руководстве по Android Studio вы можете узнать, как:

Дополнительные ресурсы

Тесты пользовательского интерфейса обычно представляют собой инструментированные тесты, которые проверяют правильное поведение пользовательского интерфейса. Они используют такие фреймворки, как Espresso или Compose Test . Чтобы узнать больше, прочитайте руководство по тестированию пользовательского интерфейса .

Для получения дополнительной информации об использовании инструментальных тестов обратитесь к следующим ресурсам.

Образец

Кодлабы