2013-08-16 2 views
38

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

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

+0

Это было задано давно. действительно ли структура тестирования Android лучше, чем robolectric {на сегодняшний день 2017/06]? – Sam

ответ

70

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

Теперь о Robolectric:

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

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

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

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

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

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

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

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

  8. В настоящее время предоставлены add-on modules, которые охватывают мульти-dex, 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. Иногда вам даже может понадобиться написать собственный тестовый бегун или применить временные решения, пока следующая версия не устранит эти проблемы. Проверьте open issues и настройте тесты соответственно.


Другой альтернативой является просто фиктивным материалом самостоятельно, никаких рамок не участвуют. Его «жесткий путь», но самый настраиваемый способ. Его простой 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) и завернуть его в полностью изолированную среду, готовя его к испытаниям.

+0

Есть ли недостатки robolectric по сравнению с платформой тестирования Android? – Traxex1909

+0

@ Traxex1909 Я обновлю ответ. –

+0

Кажется, что некоторые части не верны в этот момент, когда мы уже получили Genymotion? –

2

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

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

18

Чтобы рассказать, как я делаю ...

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

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

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

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

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

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

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

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

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

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

+1

у вас есть образцы, на которые я мог бы смотреть? : D – Spurdow