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

Начиная с Android Studio 1.1rc, есть поддержка тестирования модулей, и мне интересно, какая разница между Android Instrumentation Tests и Unit.

Как я понимаю:
Модульные тесты полезны для тестирования кода, который не называется Android API, а тесты на аппаратных средствах Android являются скорее интеграционными тестами для тестирования конкретных элементов Android API или компонентов GUI.

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


Это правильно, или есть большая разница? Если да, то в чем польза каждого?

Solutions Collecting From Web of "Разница между тестом Android Instrumentation и модульным тестированием в Android Studio?"

Тесты модулей изолируют тестируемый компонент, и именно по этой причине они часто используются вместе с каркасами Mocks как Mockito: поскольку изолировать устройство от их зависимостей. Пожалуйста, обратите внимание, что вы говорите об API Android частично, потому что есть также тесты Instrumented Unit , а именно Instrumentation является частью пакета Junit , а также классы, расширяющие TestCase как класс AndroidTestCase, являются частью пакета Junit, но Позволяет использовать A) Контекст, который вы можете вызывать с помощью getContext () и B) Ресурсы, которые являются частью Android API! Также, пожалуйста, подумайте, что AndroidTestCase является базовым классом, и есть несколько других классов, которые очень полезны для расширения этого класса. Они специально тестируют Loaders, ContentProviders и даже Services, а также имеют доступ к API Android. Поэтому эти классы предоставляют среду тестирования JUnit, а также специальные методы для Android. Теперь с Junit4 существует ServiceTestRule, который распространяется непосредственно из Object и позволяет вам легче тестировать Сервис, хотя вы не можете запустить Intent прямо внутри этого класса.

Инструментальные тесты они также входят в пакет Junit, но контроль API Android довольно тотален, потому что тесты инструментария создаются в системе до запуска любого кода приложения, и для проверки вам нужно открыть реальное приложение (эмулятор или телефон Подключенный к USB). Они получают доступ к компонентам Android (например, по кнопке) и жизненному циклу приложения, они обычно медленнее, чем тесты Junit, которые расширяют TestCase (те, которые были рассмотрены выше), типичное использование с ActivityInstrumentationTestCase2, которое имеет функциональный подход к тестированию, более ориентированный на пользователя.

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

С сайта Robolectric:

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

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

Мне кажется, что тестирование оборудования – это интеграционное тестирование с возможностью управления жизненным циклом и событиями (onStart, onCreate и т. Д.) Приложения.

Модульное тестирование, как я понимаю, тестирует Unit (например, Class) для его данных и поведения.

Например, скажем, у вас есть игра: эта игра работает на активности (основное действие), и у вас есть персонаж, основанный на классе роботов, который имеет 2 метода (огонь и движение). Вы проверили основное действие с помощью контрольно-измерительного теста, чтобы убедиться, что он правильно сохраняет, когда вы покидаете приложение, если он восстанавливается правильно при восстановлении и т. Д., И вы проверите робота с помощью теста Unit, чтобы проверить его атрибуты и поведение.

Отказ от ответственности: я не человек java, но я заинтересовался вашим вопросом, и я ответил на него, основываясь на второстепенном поиске в Интернете. Вам, вероятно, придется углубиться в это, чтобы найти более подробный ответ.

ИСПЫТАНИЕ ЕДИНИЦЫ

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

Таким образом, в основном, вы запускаете простой Java-код для тестирования, например, поставщика контента, подключений к базе данных, ввода и вывода методов. Это не работает на Android. Для запуска вам НЕ требуется устройство.

ИСПЫТАНИЕ ПРИБОРОСТРОЕНИЯ

Единичные тесты, которые запускаются на устройстве Android или эмуляторе. Эти тесты имеют доступ к информации Instrumentation, такой как контекст тестируемого приложения. Используйте этот подход для запуска модульных тестов с зависимостями Android, которые не могут легко выполнить издевательства над объектами.

Поэтому он издевается над тем, как пользователь будет использовать фактическое приложение, поэтому вам нужно использовать устройство (физическое или эмулятор) для его запуска. Он имеет доступ к представлениям, действиям, контексту и т. Д.

Ссылка: http://developer.android.com/tools/testing/testing_android.html