Обновление Apr-2015: инструменты для сборки Gradle и Android Studio now officially support unit testing и предотвратите андроид.jar от бросания заглушки (без реальной реализации). Итак, да, его можно запустить тесты на Java VM, когда соответствующие заглушки соответствуют mocked. Его начало, но все еще не сравнимое с мощью Robolectric. Существует также третий вариант, прокрутите до конца этого ответа.
Теперь о Robolectric:
Pros: вот несколько моментов, о том, как он оказался полезным в модульном тестировании:
Вам не нужно запустить эмулятор, поэтому вы может протестировать некоторые части проекта без интерфейса, не требуя эмулятора или устройства. Это также относится к работающим тестам на серверах непрерывной интеграции/сборки, не нужно запускать экземпляры эмулятора.
С Android Studio вы можете быстро запустить один конкретный тестовый класс, когда работаете над реализацией, чтобы удовлетворить тестовые примеры. Вы можете отлаживать при написании кода. Это огромный прирост производительности.
Может подделывать почти все связанные с android вещи как объекты тени, даже SQLite. Плюс каждый теневой объект предоставляет множество полезных функций, которые их обычные андроидные коллеги не предлагают. С помощью теневых копий android Object вы можете выполнять внутреннюю проверку или вызывать специальные методы.
действительно светит при тестировании многопоточного кода, как AsyncTask
с, Loopers
и Handlers
и т.д. Вы можете сделать паузу и быстро вперед нить петлители, даже основной потока. Отлично подходит для тестирования обратного вызова на основе обработчика.
Поддерживаемый формат JUnit 4. Android все еще держится на JUnit 3 в последний раз, когда я проверил.
Может сочетаться с другими инструментами тестирования, как Mockito, Эспрессо и т.д. и т.п.
Поддерживает создание экземпляра макета Activity Robolectric.buildActivity()
и его управление через ActivityController
. Фрагмент/просмотр манипуляции также работает с такими экземплярами макетной активности.
В настоящее время предоставлены add-on modules, которые охватывают мульти-dex, v4-поддержку, игровые услуги, карты и http-клиент.Итак, теперь его легко проверить код, используя эти библиотечные функции.
Против: Где я нашел это не так хорошо:
Robolectric выделяется при пособничестве Модульного тестирования, но не охватывает все функциональные возможности реального устройство или эмулятор может предложить. Например, датчики, gps, open-gl и т. Д. И т. Д.
При интеграции или тестировании пользовательского интерфейса вам понадобится эмулятор или реальное устройство, чтобы действия и службы могли взаимодействовать с полной средой Android (другие приложения, например, используя приложение для камеры, чтобы получить изображение для вашего приложения), а не ограниченный. Здесь вам нужно будет использовать тестовую среду по умолчанию, поскольку она имеет функции для проверки интерфейса.
Загрузка JNI, похоже, не поддерживается. Поэтому код с родной зависимостью не может быть протестирован.
На данный момент Robolectric имеет жесткую зависимость от платформы Google Maps для работы. И загрузит еще один android.jar из maven. Таким образом, для настройки проекта может потребоваться немного переделать. Обновление: с v3, кажется, тянет все зависимости через Gradle без особых проблем.
Новые инструменты поддержки приложений для Android и генерации отчетов и т. Д., Но только тогда, когда тест выполняется на устройстве. Поэтому с Robolectric вам придется создавать дополнительные задачи Gradle (запустить Jaococ), чтобы сделать это за вас. Обновление: Gradle 2.9 + поставляется с плагином jacoco.
Как инструменты построения градиента и андроида, так и новые версии для сборки, с высокой скоростью, стабильные версии 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
) и завернуть его в полностью изолированную среду, готовя его к испытаниям.
Это было задано давно. действительно ли структура тестирования Android лучше, чем robolectric {на сегодняшний день 2017/06]? – Sam