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

Только что скачал Android Studio, основанный на Intellij Idea.

Как можно было бы создавать тесты?

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

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

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


person Martin    schedule 16.05.2013    source источник
comment
Я также попытался создать тестовый проект. Если вы сделаете это с помощью инструмента командной строки Android, как в случае с проектом Eclipse, вы получите сообщение об ошибке, поскольку он не может найти файл AndroidManifest.xml. Похоже, что Google нужно обновить свой инструмент Android, чтобы иметь дело с проектами Grundle. Однако я новичок в тестировании на Android, поэтому ничем не могу вам помочь =(   -  person Kage    schedule 19.05.2013


Ответы (12)


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

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

Есть два разных типа тестов, которые вы будете делать.

  • Локальные модульные тесты. Они выполняются локально на JVM (виртуальная машина Java). Так как они местные, они быстрые. Вы можете использовать их для тестирования тех частей кода, которым нужна только Java, а не Android API. (Иногда вы можете создать поддельный объект API для локального тестирования. Это называется mocking. Примером может служить макет 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());
    }
}

Нажмите одну из этих зеленых кнопок еще раз.

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

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

Проведение собственного теста

Инструментированные тесты используют Espresso для запуска тестов. . Это похоже на вашего собственного маленького пользователя-робота, которому вы можете протестировать свое приложение. Вы можете сказать ему сделать что-то вроде нажатия кнопки или чтения свойств 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());
    }
}

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

Дальнейшее изучение

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

person Suragch    schedule 26.04.2017
comment
Отличный ответ @Suragch. Быстрый вопрос: куда мне поместить файлы поддержки для локального модульного теста? Это взломано, но я был бы рад указать полный путь из базы теста, но если я запускаю в Android Studio, тесты запускаются из root_/app, однако, если я запускаю из командной строки Gradle (или CI) тогда это _root. (В идеале я хотел бы получить доступ к определенным папкам assets при запуске в любом случае). - person mm2001; 06.05.2017
comment
@mm2001 мм2001, я написал этот ответ, чтобы научиться проводить тестирование самостоятельно, поэтому я даже не дошел до вас. Если вы разберетесь с этим раньше меня, вы можете оставить комментарий? - person Suragch; 07.05.2017
comment
Я нашел это полезным: stackoverflow.com/a/42751502/19506 - там написано создать папку test/resources и поместить туда файлы, например test.txt и получить к ним доступ с помощью getClass().getClassLoader().getResource("test.txt"). Я решил, что прямой доступ к ресурсам APK, вероятно, плохая идея, поэтому я буду иметь дело с этим, либо скопировав файлы для тестирования на этапе сборки, либо в процессе внешнего обновления. Остается вопрос о разных версиях Gradle, но я еще не сталкивался с этим. - person mm2001; 07.05.2017

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

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

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

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

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

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

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

person Chris    schedule 02.06.2013

Я бы предложил использовать файл 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. Теперь Вы можете создавать там любые тестовые файлы и выполнять их.

person Yuriy Chernyshov    schedule 03.12.2013
comment
Не забудьте androidTest.setRoot('instrumentTest') - person IgorGanapolsky; 23.04.2014
comment
В текущей версии Android Studio это не нужно, более того - замените все, что имеет имя instrumentTest на androidTest - person Yuriy Chernyshov; 23.04.2014
comment
Имена «instrumentTest» и «androidTest» абсолютно произвольны. Это просто имена каталогов для вашего тестового проекта. Вы также можете создать каталог «tests». Кроме того, имя пакета SDK в среде тестирования — android.test.InstrumentationTestCase. Итак, канонически я считаю, что «инструмент» или «инструментация» по-прежнему имеет смысл для обозначения тестов. См. следующий исходный код: grepcode.com/file/repository.grepcode.com/java/ext/ - person IgorGanapolsky; 23.04.2014
comment
Пожалуйста, ознакомьтесь с документацией здесь: tools.android.com/tech-docs/new -система сборки. Начиная с версии 0.9.0 instrumentTest был переименован в androidTest. - person Yuriy Chernyshov; 24.04.2014
comment
@IgorGanapolsky Имя папки как androidTest НЕ является произвольным. Это необходимо сделать для того, чтобы папка стала зеленой. - person clocksmith; 27.02.2015

Я думаю, что это сообщение от Рекса Сент-Джона очень полезно для модульного тестирования с Android Studio.


(источник: rexstjohn.com)

person Saeed Zarinfam    schedule 14.04.2014

Android Studio v.2.3.3

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

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

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

person Hypersoft Systems    schedule 01.11.2017

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

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

person Daber    schedule 22.06.2014

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

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

person AndroidDev    schedule 15.05.2015
comment
Да, AS продолжает развиваться, поэтому довольно глупо, когда кто-то создает статью о передовых технологиях и никогда не упоминает номер версии, к которой она относится. единственная подсказка - дата в самом низу. - person Tom; 16.05.2015

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

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

person Kage    schedule 30.05.2013

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

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

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

person nurnachman    schedule 12.06.2015

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 сообщает вам, где разместить ваши тестовые классы.

person Miguel El Merendero    schedule 24.10.2014

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

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

person marius bardan    schedule 10.02.2015
comment
Поддержка написания тестов Android только что была улучшена благодаря новой библиотеке тестов поддержки. Прекрасную презентацию можно посмотреть здесь:docs.google. .com/презентация/d/ - person marius bardan; 27.04.2015

Добавьте ниже 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));
    }
}
person Bishwajeet Biswas    schedule 04.04.2017