Intereting Posts
Softkeyboard скрывает кнопку ниже многострочного EditText? Android: создание различных версий моего приложения (бесплатно, премиум и т. Д.) С Eclipse Эффект затухания между макетами «Нет подключенных устройств», пытаясь подключить мою LG к моей машине Ubuntu Понимание того, когда и почему использовать разные потоки Android OSMDroid Загрузка пользовательских офлайн-плит из папки «Активы» Как я могу сделать свой ArrayAdapter следующим за шаблоном ViewHolder? Изменение размера маркера в API Карт Google v2 Как я могу использовать режим пакетной камеры для новых телефонов Android в моем приложении? Android ImageView не отображает изображение? Smack на Android, получив код ошибки = «404» remote-server-not-found при отправке пакетов / сообщений между двумя пользователями через локальный сервер Openfire Как найти пересечение между двумя ImageView при перетаскивании? React Native Android Splash Screen Android, используя SimpleCursorAdapter для установки цвета не только строк Как включить Spongy Castle JAR в 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 не требуют запуска эмулятора или устройства для запуска тестов и, таким образом, намного быстрее.

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