Як я можу створити тести в Android Studio?


109

Щойно завантажена Android Studio, яка базується на ідеї Intellij.

Як можна створити тести?

Я помічаю, що є можливість створити тестовий модуль, але це, здається, нічого не робить, лише створити новий проект з src

Я також спробував натиснути гарячу клавішу CTRL + AlT + T, яка дозволяє створювати одиничні тести на існуючому класі, але, схоже, хочеться розмістити його в поточному проекті. Звичайно, це не допомагає з TDD

Хтось має тут досвід?


2
Я також спробував створити тестовий проект. Якщо ви робите це за допомогою інструмента командного рядка Android, як у проекті Eclipse, ви отримуєте помилку, оскільки він не може знайти файл AndroidManifest.xml. Схоже, Google повинен оновити свій інструмент Android для вирішення проектів Grundle. Однак я новачок у тестуванні на Android, тому не можу вам допомогти = (
Kage

Відповіді:


56

Ця відповідь призначена для людей, які тільки починають тестувати Android. Я надам два простих приклади, які допоможуть вам побачити, як працює тестування. Якщо ви дотримуєтесь наступних 10 хвилин, ви будете готові почати додавати тести до власного додатку. Я думаю, ти здивуєшся, як це легко. Я, звичайно, був.

Вступ до тестування Android

Ви будете робити два різні типи тестів.

  • Випробування на локальній одиниці. Вони запускаються локально на JVM (Java Virtual Machine). Оскільки вони місцеві, вони швидкі. Ви можете використовувати їх для тестування частин вашого коду, які просто потрібні Java, а не API для Android. (Іноді ви можете зробити підроблений об’єкт API, щоб перевірити більше речей локально. Це називається глузуванням . Приклад - макет Context.)
  • Інструментальні випробування. Ці тести виконуються на реальному пристрої або в емуляторі. Це робить їх повільніше, ніж місцеві тести. Однак вони більш гнучкі, оскільки у вас є повний доступний API для Android.

Створіть новий проект, і ви побачите наступні папки за замовчуванням.

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

Все вже є і чекаю, коли ви створите свої тести. Це все налаштовано вже!

Як створити тести локальної одиниці

Відкрийте 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> 

Потім натисніть кнопку Виконати> Записати тест еспресо в меню.

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

Після запуску натисніть кнопку в емуляторі, а потім, щоб закінчити, виберіть OK у діалоговому вікні Запис. Він повинен автоматично генерувати наступний тестовий код.

@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), то це _корінь . (В ідеалі я хотів би отримати доступ до певних assetsпапок під час запуску в будь-якому випадку).
мм2001

@ mm2001, я написав цю відповідь як спосіб навчитися робити тестування самостійно, тому я навіть не дістався, як у вас. Якщо ви зрозумієте це до того, як я це зробити, чи можете ви залишити коментар?
Сурагч

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

36

Редагувати: Станом на 0.1.8 це тепер підтримується в IDE . Будь ласка, дотримуйтесь вказівок, а не використовуйте наведені нижче інструкції.

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

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

Це запустило мої тести і помістило результати тестів у MyApplicationProject / MyApplication / build / звіти / instrumentTests / підключено. Я новачок у тестуванні додатків для Android, але, здається, працює добре.

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

  1. Оновіть build.gradle, щоб перерахувати Maven Central як репо
  2. Оновіть build.gradle додайте JUnit 3.8 як instrumentTestCompile залежність, наприклад 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')
IgorGanapolsky

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 НЕ довільно. Це потрібно зробити для того, щоб папка стала зеленою.
слюсар


10

Android Studio v.2.3.3

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

Використовуйте діалоговий інтерфейс, щоб завершити налаштування.

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


7

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

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


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. Введіть ім’я для конфігурації запуску (бажано "Тести AppName")
  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, у нас є офіційна (експериментальна) підтримка для написання модульних тестів (також працює робоелектрик).

Джерело: https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support


Підтримка написання тестів на Android, щойно покращилася, отримала нову тестову бібліотеку підтримки.
Приємну

0

Додайте нижче лібу всередині файлу 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.