Как я могу создавать тесты в Android Studio?


109

Просто скачали Android Studio, основанную на идее Intellij.

Как создать тесты?

Я заметил, что есть возможность создать тестовый модуль, но это, похоже, ничего не делает, только создайте новый проект с src

Я также попытался нажать горячую клавишу CTRL + AlT + T, которая позволяет создавать модульные тесты для существующего класса, но, похоже, хочет поместить его в текущий проект. Конечно, это не помогает с TDD

У кого-нибудь есть здесь опыт?


2
Я тоже пробовал создать тестовый проект. Если вы сделаете это с помощью инструмента командной строки Android, как с проектом Eclipse, вы получите сообщение об ошибке, потому что он не может найти файл AndroidManifest.xml. Похоже, Google нужно обновить свой Android-инструмент, чтобы иметь дело с проектами Grundle. Тем не менее, я новичок в тестировании на Android, поэтому я не могу вам помочь = (
Каге,

Ответы:


56

Этот ответ предназначен для людей, которые только начинают тестирование Android. Я приведу два простых примера, которые помогут вам понять, как работает тестирование. Если вы будете следовать этим инструкциям в течение следующих 10 минут, у вас будет все готово, чтобы начать добавлять тесты в собственное приложение. Думаю, вы удивитесь, насколько это просто. Конечно, был.

Введение в тестирование Android

Вам предстоит пройти два разных типа тестов.

  • Локальные модульные тесты. Они запускаются локально на JVM (виртуальной машине Java). Поскольку они местные, они быстрые. Вы можете использовать их для тестирования тех частей вашего кода, которым нужна только Java, а не Android API. (Иногда вы можете создать поддельный объект API, чтобы протестировать больше вещей локально. Это называется насмешкой . Например, макет Context.)
  • Инструментальные тесты. Эти тесты запускаются на реальном устройстве или в эмуляторе. Это делает их медленнее, чем местные тесты. Однако они более гибкие, потому что вам доступен полный Android API.

Создайте новый проект, и вы увидите следующие папки по умолчанию.

введите описание изображения здесь

Все уже есть и ждут, когда вы создадите свои тесты. Все уже настроено!

Как создавать локальные модульные тесты

Откройте ExampleUnitTestфайл, показанный на изображении выше. это должно выглядеть примерно так:

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

Нажмите двойную зеленую стрелку, чтобы запустить все тесты, или одну зеленую стрелку, чтобы запустить только один. (В этом случае есть только один тест, поэтому они оба делают одно и то же.)

введите описание изображения здесь

Он должен пройти (пока 2 + 2он еще остается, 4когда вы читаете этот ответ). Поздравляем, вы только что выполнили свой первый тест!

Сделайте свой собственный тест

Напишем свой тест. Сначала добавьте этот класс в свой основной проект приложения, чтобы нам было что протестировать:

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}

Теперь измените addition_isCorrect()метод в тестовом классе, чтобы он был похож на следующий код (или просто добавьте другой метод с другим именем):

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        MyClass myClass = new MyClass();
        int result = myClass.add(2, 2);
        int expected = 4;
        assertEquals(expected, result);
    }
}

Запустите его снова, и вы увидите, что он прошел. Поздравляем, вы только что создали свой первый тест! (Ну, технически я предполагаю, что это было мое, но, эй, достаточно близко. То, что мое, твое.)

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

Откройте ExampleInstrumentedTestфайл. это должно выглядеть примерно так:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.myapp", appContext.getPackageName());
    }
}

Снова нажмите одну из этих зеленых кнопок.

введите описание изображения здесь

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

Сделайте свой собственный тест

В инструментальных тестах для запуска тестов используется эспрессо . Это похоже на вашего собственного маленького пользователя-робота, которого вы можете протестировать. Вы можете сказать ему сделать что-то вроде нажатия кнопки или чтения свойств TextView.

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

Сначала добавьте кнопку в свой пользовательский интерфейс, чтобы нам было с чем поработать. Я сделал это:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity">

    <Button
        android:id="@+id/myButton"
        android:text="Click me"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout> 

Затем нажмите « Выполнить»> «Записать тест эспрессо» в меню.

введите описание изображения здесь

После его запуска нажмите кнопку в эмуляторе, а затем, чтобы закончить, выберите ОК в диалоговом окне «Запись». Он должен автоматически сгенерировать следующий тестовый код.

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
        appCompatButton.perform(click());
    }
}

Большой! Вы только что создали свой первый инструментальный тест! Это было очень просто. Вам, вероятно, следует добавить утверждение, чтобы провести настоящий тест, но это довольно легко сделать и с рекордером. Посмотрите это видео, чтобы узнать больше.

Дальнейшее обучение

Я сначала смотрел видео, а потом читал документацию. Все это очень помогает. Последняя ссылка - это серия статей, в которых рассказывается о некоторых важных вещах, о которых следует подумать при выборе того, что тестировать.


1
Отличный ответ @Suragch. Быстрый вопрос: где бы мне разместить файлы поддержки для локального модульного теста? Это взломано, но я был бы счастлив указать/app полный путь из базы теста, но если я запускаю в Android Studio, тесты запускаются из root_ , однако, если я запускаю из командной строки Gradle (или CI), тогда это _root . (В идеале я хотел бы получить доступ к определенным assetsпапкам при любом запуске).
mm2001

@ mm2001, я написал этот ответ, чтобы научиться самому проводить тестирование, поэтому я даже не продвинулся так далеко, как вы. Если вы разберетесь с этим раньше меня, не могли бы вы оставить комментарий?
Suragch

Я нашел это полезным: stackoverflow.com/a/42751502/19506 - он говорит, что создайте папку test/resourcesи поместите туда файлы, например, test.txtи получите к ним доступ с помощью getClass().getClassLoader().getResource("test.txt"). Я решил, что прямой доступ к ресурсам APK, скорее всего, плохая идея, поэтому я разберусь с этим, скопировав файлы для тестирования на этапе сборки или в процессе внешнего обновления. Остается вопрос о разных версиях Gradle, но я с этим еще не сталкивался.
mm2001

36

Изменить: начиная с версии 0.1.8 это теперь поддерживается в среде IDE . Пожалуйста, следуйте инструкциям там, вместо того, чтобы использовать инструкции ниже.

Следуя руководству пользователя подключаемого модуля Android Gradle, я смог заставить тесты работать в командной строке, выполнив следующие шаги во вновь созданном проекте (я использовал пакет com.example.myapplication по умолчанию):

  1. Добавьте каталог src / instrumentTest / java для тестов
  2. Добавьте тестовый класс (расширяющий ActivityTestCase) в пакет com.example.myapplication.test
  3. Запустить виртуальное устройство
  4. В командной строке (в каталоге MyApplicationProject / MyApplication) используйте команду '../gradlew connectedInstrumentTest'

Это запустило мои тесты и поместило результаты тестов в MyApplicationProject / MyApplication / build / reports / instrumentTests / connected. Я новичок в тестировании приложений для Android, но, похоже, все работает нормально.

Из среды IDE можно попробовать запустить тот же тестовый класс. Вам нужно будет

  1. Обновите build.gradle, чтобы указать Maven Central как репо
  2. Обновите build.gradle, добавьте JUnit 3.8 в качестве зависимости инструментаTestCompile, например, instrumentTestCompile 'junit: junit: 3.8'
  3. В «Структуре проекта» вручную переместите JUnit на первое место в порядке зависимостей.

Однако это не удается (в пути к классам, используемом при запуске тестов, отсутствует выходной каталог теста). Однако я не уверен, что это сработает независимо от того, насколько я понимаю, требуется специальный тестовый запуск для Android.


20

Я бы посоветовал использовать файл gradle.build .

  1. Добавьте каталог src / androidTest / java для тестов (как начинает объяснять Крис )

  2. Откройте файл gradle.build и укажите там:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
  3. Нажмите «Синхронизировать проект с файлом Gradle» (на верхней панели). Теперь вы должны увидеть папку «java» (внутри «androidTest») зеленого цвета.

  4. Теперь вы можете создавать там любые тестовые файлы и запускать их.


Не забывайте androidTest.setRoot ('instrumentTest')
Игорь Ганапольский

3
В текущей версии Android Studio в этом нет необходимости, более того - замените все, что имеет имя instrumentTest, на androidTest
Юрий Чернышов

Имена «instrumentTest» и «androidTest» совершенно произвольны. Это просто имена каталогов для вашего тестового проекта. Вы также можете создать каталог «тесты». Кроме того, имя пакета SDK в среде тестирования - android.test.InstrumentationTestCase. Так что канонически я считаю, что «инструмент» или «инструментарий» все еще имеет смысл для обозначения тестов. См. Следующий исходный код: grepcode.com/file/repository.grepcode.com/java/ext/…
IgorGanapolsky

7
Пожалуйста, прочтите документацию здесь: tools.android.com/tech-docs/new-build-system . Начиная с версии 0.9.0 instrumentTest был переименован в androidTest .
Юрий Чернышов

1
@IgorGanapolsky Именование папки androidTest НЕ произвольно. Это необходимо сделать для того, чтобы папка стала зеленой.
Clocksmith


10

Android Studio v.2.3.3

Выделите контекст кода, который вы хотите протестировать, и используйте горячую клавишу: CTRL+ SHIFT+T

Используйте диалоговый интерфейс, чтобы завершить настройку.

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


7

На данный момент (студия 0.61) достаточно поддерживать правильную структуру проекта. Нет необходимости создавать отдельный тестовый проект, как в eclipse (см. Ниже).

Структура тестов


4

Android Studio продолжает развиваться, поэтому приведенные выше ответы в конечном итоге больше не будут применяться. Для текущей версии Android Studio 1.2.1.1 есть хорошее руководство по тестированию по адресу:

http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/


2
Да, AS продолжает развиваться, поэтому для кого-то довольно глупо создавать статью о передовых технологиях и никогда не упоминать номер версии, к которой она относится. единственная подсказка - это дата в самом низу.
Том

3

Одним из основных изменений, по-видимому, является то, что в Android Studio тестовое приложение интегрировано в проект приложения.

Я не уверен, помогает ли это вашей конкретной проблеме, но я нашел руководство по проведению тестов с помощью проекта Gradle. Руководство пользователя Android Gradle


3

Самый простой способ, который я нашел, - это упрощенный вариант в моем следующем сообщении в блоге :

  1. Создайте папку, в которой вы будете писать все свои модульные тесты (желательно com.example.app.tests)
  2. Создайте новый тестовый класс (желательно NameOfClassTestedTests, т.е. BankAccountLoginActivityTests)
  3. Расширить InstrumentationTestCase
  4. Напишите неудачный модульный тест, чтобы убедиться, что мы успешно настроили модульные тесты.
  5. Обратите внимание, что имя метода модульного тестирования должно начинаться со слова «test» (предпочтительно testTestedMethodNameExpectedResult (), т.е. testBankAccountValidationFailedShouldLogout ())
  6. Настройте свой проект для модульных тестов:
  7. Откройте меню "Выполнить ..." и нажмите "изменить конфигурации".
  8. Нажмите кнопку +
  9. Выберите шаблон Android Tests
  10. Введите имя для вашей конфигурации запуска (желательно «Тесты имени приложения»)
  11. Выберите свое приложение в выпадающем списке модуля
  12. Выберите переключатель «Все в пакете» (обычно вы хотите выбрать этот вариант, потому что он запускает все модульные тесты во всех ваших тестовых классах)
  13. Введите имя тестового пакета из шага 1 (например, com.example.app.tests)
  14. Выберите устройство, на котором вы хотите запустить тесты
  15. Применить и сохранить конфигурацию
  16. Запустите модульные тесты (и ожидайте неудачи):
  17. Выберите вновь созданную конфигурацию тестов в меню «Выполнить».
  18. Нажмите «Выполнить» и прочтите результаты в консоли вывода.

Удачи вам в создании более читабельного, поддерживаемого и хорошо протестированного кода!


Речь шла об испытаниях КИПиА! У меня также есть трудности с написанием некоторых инструментальных тестов. См. Мой вопрос на stackoverflow.com/questions/35426990/…
Моника

2

Android Studio была своего рода движущейся мишенью, сначала это была предварительная версия для разработчиков, а сейчас находится в стадии бета-тестирования. Путь к тестовым классам в проекте со временем изменился, но независимо от того, какую версию AS вы используете, путь объявлен в вашем .iml файле. В настоящее время в версии 0.8.3 вы найдете следующее во внутреннем iml-файле:

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

Файл .iml сообщает вам, где разместить тестовые классы.


2

Начиная с Android Studio 1.1, у нас есть официальная (экспериментальная) поддержка написания модульных тестов (Roboelectric также работает).

Источник: https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support


Поддержка написания тестов Android только что была улучшена благодаря новой библиотеке тестов поддержки. Вы можете увидеть красивую презентацию здесь: docs.google.com/presentation/d/…
мариус бардан

0

Добавьте ниже lib внутри файла gradle

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Создайте класс HomeActivityTest в каталоге androidTest и перед запуском теста добавьте строку flurry_api_key и sender_id в файл строковых ресурсов и измените значение для случая сбоя и успеха.

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.