Модульные тесты с Android Studio и Gradle?

Как я могу добавить модульные тесты в свои Android-проекты в Android Studio (IntelliJ)?

Точнее: я хочу добавить папку с тестовым кодом (JUnit 4) и выполнить оттуда тесты с помощью обычного установленного JDK (не в эмуляторе Android). До сих пор я добавлял тестовые файлы/java/'в мой модуль и добавлял "test" в качестве источника и junit в качестве тестовой зависимости:

sourceSets {
  instrumentTest.setRoot('src/test')
}

dependencies {
  instrumentTestCompile 'junit:junit:4.+'
  // ...
}

Когда я сейчас выбираю Запустить "Все тесты" в папке test/java, он дает мне исключение UnsupportedOperationException.

Что мне не хватает? Как вы запускаете модульные тесты для проектов Android?

Бонусные баллы за рекомендацию плагина, который работает как "Infinitest" в Eclipse, где я могу просто сохранить класс, и его unit test будет автоматически выполнен.: -)

PS: Я не хочу использовать https://github.com/JakeWharton/gradle-android-test-plugin, поскольку этот плагин, похоже, уже не рекомендуется.

Ответ 1

Я думаю, что ответ должен быть теперь уже в Android Studio 1.1 (и в текущем плагине gradle). Они внедрили поддержку unit test. Это все еще экспериментально, но меньше, чем наши предыдущие усилия здесь:) См. здесь.

Ответ 2

Я провел прошлые недели (также) по этому поводу. Собственно, на том, что на стероидах, так как мне также пришлось поместить Robolectric в горшок.

Короткий ответ: если я не запутаю эту ошибку с чем-то другим, я думаю, что вы пытаетесь запустить модульные тесты с помощью Android testrunner.

Длинный ответ: Я закончил с устаревшим плагином (после того, как попробовал его, а затем попытался поместить тесты в папку androidTest), потому что он решил для меня некоторые проблемы с Дженкинсом. Недостатком является то, что он не распознает саму папку как код java или android, поэтому завершение кода работает со всем, кроме содержимого папки (например, он правильно видит базовый проект и все зависимости).

Мне нужно было запустить его в Android Studio, чтобы создать тестировщик JUnit (не Android). Вероятно, он не будет работать из коробки, потому что порядок пути к классам запутан (хотя он отлично работает, просто запуская тесты в gradle).

В основном я должен был выполнить следующие шаги:

  • Запустите junit testrunner, чтобы увидеть командную строку, используемую AS
  • Отредактируйте аргумент -classpath, выполнив следующие действия:

    • переместить junit > 3.8 в верхней части строки (я думаю, потому что в противном случае вы получите тот, который находится в android, который слишком старый)
    • переместите robolectric как второй, если вы ссылаетесь на него, иначе реальные методы Android будут найдены до robolectric.
    • добавьте путь вывода тестовых классов к концу, поэтому он найдет ваши тесты (не забудьте завершить тестовые классы с помощью "Test", иначе они не будут найдены).
  • Добавляем -classpath, который вы только что создали, к параметрам VM для runner после -ea (Я нашел это решение или его части во многих местах, очень хороший: http://kostyay.name/android-studio-robolectric-gradle-getting-work/, и он применяется также к простому блоку тесты).

Альтернатива, которую я не пробовал, но я подумал, было предложено этим утром (см. последний пост): https://groups.google.com/forum/#!topic/adt-dev/Y8-ppkWell0

У меня много разбросанных знаний прямо сейчас из-за многих проблем, которые я обнаружил из-за предварительного просмотра SW и тонны информации, которую я должен был пройти, чтобы решить их, но если у вас есть более конкретная проблема по этой теме, просто позвольте я знаю:)