Intereting Posts
Как получить данные из курсора в Android? UIImageView для показа хода загрузки приложения Поддержка SNT для Android HTTPS с использованием SSLCertificateSocketFactory Проложить маршруты с помощью API Карт Google v2 Пользовательский календарь Android с просмотром месяца Как разобрать строку измерения и преобразовать ее в значение измерения Как загрузить изображение в синтаксический анализатор, используя parse api в android Отношения «один-ко-многим» на ORMLite Android Яркость экрана управления в android с использованием «Фоновой службы» Как использовать greenrobot для передачи данных в действие или фрагмент, который еще не был инициализирован? Android ScrollView не работает должным образом Получение последней версии приложения из Google PlayStore в случае загрузки mutiple apk Выравнивание текста в центре – Spinner Диапазон HttpUrlConnection Диапазон в Android игнорируется Получение цены с веб-сайта продавца

Robolectric vs Android Framework для тестирования

Предоставляет ли Robolectric явные преимущества по сравнению с платформой Android Test Framework ? Я прочитал документы, касающиеся обеих фреймворков, но, насколько я вижу, единственное преимущество Clear Robot Electric в том, что он работает на JVM, а не на DalvikVM, что делает его быстрее, чем Android.

Есть ли другие важные преимущества, которые выделяются?

Обновление Apr-2015 : инструменты сборки Gradle и Android Studio теперь официально поддерживают модульное тестирование и предотвращают ошибку android.jar от бросания заглушки (без реальной реализации). Итак, да, его можно запустить тесты на виртуальной машине Java, когда заглушки соответствующим образом высмеиваются . Его начало, но все еще не сравнимое с мощью Робоэлектрика. Существует также третья альтернатива, прокрутите до конца этого ответа.

Теперь о Robolectric:

Плюсы : вот несколько моментов о том, как это оказалось полезным в модульном тестировании:

  1. Вам не нужно запускать эмулятор, поэтому вы можете протестировать некоторые части проекта без интерфейса, не требуя эмулятора или устройства. Это также относится к запуску тестов на серверах непрерывной интеграции / сборки, не нужно запускать экземпляры эмулятора.

  2. С помощью Android Studio вы можете быстро запустить один конкретный тестовый класс, когда работаете над реализацией, чтобы удовлетворить тестовые примеры. Вы можете отлаживать при написании кода. Это огромный прирост производительности.

  3. Может подделывать почти все связанные с android вещи как теневые объекты, даже SQLite. Плюс каждый теневой объект предоставляет множество полезных функций, которые их обычные андроидные коллеги не предлагают. С помощью теневых копий android Object вы можете выполнять внутреннюю проверку или вызывать специальные методы.

  4. Действительно сияет при тестировании многопоточного кода, такого как AsyncTask s, Loopers и Handlers и т. Д. Вы можете приостановить и ускорить поток Loopers, даже основной поток. Отлично подходит для тестирования обратного вызова на основе обработчика.

  5. Поддерживается формат JUnit 4. Android все еще держит JUnit 3 в последний раз, когда я проверил.

  6. Может сочетаться с другими инструментами тестирования, такими как Mockito, Espresso и т. Д.

  7. Поддерживает создание экземпляра экземпляра Activity Robolectric.buildActivity() и его управление через ActivityController . Фрагмент / просмотр манипуляции также работает с такими экземплярами макетной активности.

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

Минусы : Где я нашел это не очень хорошо:

  1. Robolectric отлично справляется с тестированием модулей, но не охватывает все функциональные возможности, которые может предложить настоящее устройство или эмулятор. Например, датчики, gps, open-gl и т. Д. И т. Д.

  2. При интеграции или тестировании пользовательского интерфейса вам понадобится эмулятор или реальное устройство, чтобы действия и службы могли взаимодействовать с полной средой Android (другие приложения, например, с помощью приложения для камеры, чтобы получить изображение для вашего приложения), а не ограниченный. Здесь вам нужно использовать стандартную тестовую среду, так как она имеет функции для проверки интерфейса.

  3. Загрузка JNI, похоже, не поддерживается. Таким образом, код с нативной зависимостью не может быть протестирован.

  4. На данный момент Robolectric имеет жесткую зависимость от платформы Google Maps для работы. И загрузит еще один android.jar из maven. Таким образом, для настройки проекта может потребоваться немного переделать. Обновление: с v3 он, кажется, тянет все зависимости через Gradle без особых проблем.

  5. Новые инструменты поддержки Android поддерживают покрытие и создание отчетов и т. Д., Но только тогда, когда тестирование выполняется на устройстве. Поэтому с Robolectric вам придется создавать дополнительные задачи Gradle (запустить Jaococ), чтобы сделать это за вас. Обновление: Gradle 2.9 + поставляется с плагином jacoco.

  6. Поскольку инструменты для создания градиента и андроида строят быстрее, новые версии для быстрой сборки, стабильные версии Robolectric иногда начинают возникать проблемы с измененной инструментами построения. Наиболее типичными проблемами являются: версия sdk несовместима, манифест не найден, несоответствие путей создания выходных данных, ресурсы не загружаются, проблемы с конфигурацией сборки и т. Д. Некоторые проблемы также связаны с ошибками в инструментах android. Иногда вам даже придется писать свой собственный тестовый бегун или применять обходные пути, пока следующая версия не устранит эти проблемы. Проверьте открытые проблемы и соответствующим образом настройте тесты.


Другой альтернативой является просто макетный материал по своему усмотрению, без каких-либо структур. Его «трудный путь», но самый настраиваемый способ. Его простой JUnit с JMockit:

 @RunWith(JMockit.class) public class OtherTest { public void testHandlerCallback(@Mocked final FragmentTransaction transaction, @Mocked final FragmentManager manager, @Mocked final Activity activity, @Mocked final LayoutInflater inflater, @Mocked final ViewGroup parent) { final List<Fragment> fragments = new ArrayList<>(); new Expectations() {{ activity.getFragmentManager(); result = manager; manager.beginTransaction(); result = transaction; transaction.add(withCapture(fragments), anyString); transaction.commit(); result = new Delegate<Void>() { public int commit() { View v = fragments.get(0).onCreateView(inflater,parent,null); Deencapsulation.invoke(v,"onMeasure",0,0); return 0; } }; }}; } } 

Выше – грубый и примерный пример. Фактически вы можете создавать надлежащие повторно используемые классы (скажем, FragmentTestHarness ), которые будут тестировать компонент (скажем, Fragment ) и переносить его в полностью изолированную среду, готовя его к тестированию.

Разделить, как я это делаю …

Robolectric Для SQL, поток действий, для тех объектов, которые нуждаются в контексте.

JUnit4 для java-модуля api, чтобы убедиться, что данные верны.

Espresso Для правильной проверки ui.

Когда я изменил api … я только запускаю jUnit4.

Когда я изменил привязку данных между api и UI или Sqlite, тогда я буду запускать Robolectric.

Когда я модифицировал интерфейс, я запускаю только Espresso.

Иногда я буду запускать Robolectric и эспрессо вместе, но очень редко.

Но я буду запускать все перед публикацией, чтобы играть в магазин.

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

Поправьте меня, если я ошибаюсь.

Главным преимуществом Robolectric является скорость. Единичные тесты с Robolectric не требуют запуска эмулятора или устройства для запуска тестов и, таким образом, намного быстрее.

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