Різниця між тестом Android Instrumentation та модульним тестом в Android Studio?


74

Що стосується Android Studio 1.1rc, існує підтримка модульного тестування, і мені цікаво, в чому різниця між тестуванням приладів Android та модульним тестуванням.

Як я розумію:
модульні тести корисні для тестування коду, який не викликає Android API, а тести приладобудування Android - це швидше тести інтеграції для тестування елементів Android API або компонентів графічного інтерфейсу.

Однак якщо ви використовуєте фреймворк, такий як Robolectric або Mockito, у своїх модульних тестах, ви можете протестувати код Android (без потреби в пристрої), якщо я не помиляюся.


Це правильно, чи є більша різниця? Якщо так, то яка користь від кожного?

Відповіді:


41

Модульні тести ізолюють тестований компонент, і саме тому часто їх використовують разом із фреймворками Mocks як Mockito: оскільки ізолюють блок від їх залежностей. Будь ласка, зверніть увагу на те, що ви говорите щодо Android API, частково відповідає дійсності, оскільки існують також інструментовані модульні тести , а саме Instrumentation також є частиною пакету Junit , а також класи, які розширюють TestCase як клас AndroidTestCaseє частиною пакету Junit, але дозволяє використовувати A) Context, який ви можете викликати за допомогою getContext () та B) Ресурсів, які є частиною Android API! Також, будь ласка, розгляньте AndroidTestCase як базовий клас, і є ще декілька цілком корисних класів, які розширюють цей клас. Вони тестують спеціально Loaders, ContentProviders і навіть Сервіси, а також вони мають доступ до Android API. отже, ці класи забезпечують структуру тестування JUnit, а також спеціальні методи для Android. Тепер з Junit4 існує ServiceTestRule, яка поширюється безпосередньо від Object і дозволяє вам легше протестувати службу, хоча ви не можете запустити Intent безпосередньо всередині цього класу.

Тести контрольно-вимірювальних приладів вони також входять до пакету Junit, але контроль над Android API є цілком повним, оскільки інструментальні тести створюються в системі перед запуском будь-якого коду програми, і для тестування потрібно відкрити реальну програму (емулятор або телефон підключений через USB). Вони отримують доступ до компонентів Android (наприклад, натисніть кнопку) та життєвого циклу програми, зазвичай вони повільніші, ніж тести Junit, що розширюють TestCase (розглянуті вище), як правило, використання ActivityInstrumentationTestCase2, який має функціональний тестовий підхід, більш орієнтований на користувача.

EDIT: Що стосується Roboelectric та Mockito, які поєднуються з Espresso між найпопулярнішими фреймворками на даний момент (13 липня 2016 р.), Roboelectric дозволяє запускати кілька тестів за секунди, а не за хвилини, і це дуже зручно для команд, які повинні проводити безперервні тести та підлягати постійній інтеграції.

З сайту Robolectric:

Альтернативний підхід до Robolectric - використання макетних фреймворків, таких як Mockito, або макет Android SDK. Хоча це дійсний підхід, він часто дає тести, які по суті є зворотними реалізаціями коду програми. Roboelectric дозволяє тестовий стиль, що наближається до тестування чорних ящиків, роблячи тести більш ефективними для рефакторингу та дозволяючи тестам зосередитись на поведінці програми, а не на реалізації Android. Ви все ще можете використовувати глузувальний фреймворк разом із Robolectric, якщо хочете.

Mockito, який також може використовуватися з Junit, насправді використовується, за винятком випадків, коли доводиться керувати кінцевими класами, анонімними класами або примітивними типами.


47

Мені здається, що тестування інструментарію - це інтеграційне тестування з можливістю контролювати життєвий цикл та події (onStart, onCreate тощо) програми.

Unit-тестування, наскільки я розумію, - це тестування Unit (наприклад, Class) на його дані та поведінку.

Наприклад, скажімо, у вас є гра: ця гра працює за певною діяльністю (основна діяльність), і у вас є персонаж на основі класу Робот, який має 2 методи (стріляти та рухатись). Ви б протестували основну діяльність за допомогою контрольно-вимірювального приладу, щоб побачити, чи правильно він зберігається, коли ви залишаєте програму, чи правильно вона відновлюється, коли ви її відновлюєте тощо, і ви тестували робота за допомогою юніт-тесту, щоб перевірити його атрибути та поведінку.

Застереження: Я не людина Java, але я зацікавився вашим запитанням і відповів на ньому на основі незначного пошуку в Інтернеті. Ймовірно, вам доведеться заглибитися в це, щоб знайти більш детальну відповідь.


35

ТЕСТУВАННЯ ОДИНИЦІ

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

Отже, в основному ви запускаєте звичайний код Java для тестування, наприклад, постачальника вмісту, підключення до бази даних, введення та виведення методів. Це не працює на Android. Для його запуску НЕ потрібен пристрій.

ІНСТРУМЕНТАЦІЙНЕ ТЕСТУВАННЯ

Модульні тести, які працюють на пристрої Android або емуляторі. Ці тести мають доступ до інформації про прилади, наприклад, до контексту тестованої програми. Використовуйте цей підхід для запуску модульних тестів, які мають залежності Android, які знущаються над об’єктами, які неможливо легко задовольнити.

Отже, він висміює, як користувач використовуватиме фактичний додаток, тому вам потрібен пристрій (фізичний чи емулятор) для його запуску. Він має доступ до поглядів, діяльності, контексту тощо.

Довідково: http://developer.android.com/tools/testing/testing_android.html



1

Одиничне тестування:

Часто Юніт тести називаються «місцевих випробувань» або «локальних модульних тестів». Основною причиною цього, здається, є те, що ви хочете мати можливість запускати тести без підключеного пристрою чи емулятора.

Модульні тести не можуть перевірити користувальницький інтерфейс для вашої програми без знущань над такими об’єктами, як Activity.


Випробування приладів:

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

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


Наприклад, посилання на посилання


0

Одиничне тестування

Він працює лише на локальній машині.

Кейс для контрольно-вимірювальних приладів

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


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.