Покрытие кода для Android (calabash-android BDD)

Я тестирую свое приложение для Android с помощью calabash-android, который предоставляет собственный «тестовый проект» со сценарием, который переименовывает его пакет, чтобы отразить тестируемое приложение, а затем использует подкласс InstrumentationTestRunner:

adb shell am instrument -w -e class sh.calaba.instrumentationbackend.InstrumentationBackend #{ENV['TEST_PACKAGE_NAME']}/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner 

Я приму любой ответ, который позволяет мне генерировать отчет о покрытии кода, похожий на Emma или Cobertura для Android-приложения, с данными, собранными во время тестирования в calabash-android.

В попытке получить работу Эммы у меня есть …

  • Попытка следовать этим инструкциям, чтобы заставить Maven построить мой проект (потому что это было слишком долго, так как я использовал муравей). Файл target/emma создается в target/emma
  • Изменен скрипт calabash-android, добавив « -e coverage true »,
  • Когда я запускаю calabash-андроид, я в конце концов вижу «Сгенерированные данные покрытия в /data/data/my.project/files/coverage.ec»
  • adb -e pull /data/data/my.project/files/coverage.ec coverage.ec

… так что теперь я должен иметь возможность запускать:

  • java -cp $ANDROID_HOME/tools/lib/emma.jar emma report -r html -in target/emma/coverage.em,coverage.ec

Но я получаю сообщение об ошибке:

 EMMA: processing input files... java.io.UTFDataFormatException: malformed input around byte 107 

… Поэтому я предполагаю, что что-то не так с плагином android maven , и я пытаюсь выяснить, как создать файл coverage.em . Я запустил android update project -p . И ant emma и ant emma debug , но я не могу найти ant emma debug любом месте

… Сгенерированный файл build.xml, по-видимому, подразумевает, что генерация файла coverage.em генерируется только при запуске «ant emma test», но я не думаю, что это сработает, потому что тестовое приложение контролируется кальян-андроид.

В попытке получить работу Cobertura у меня есть …

  • Googled различные формы «cobertura android», но не похоже, что кому-то повезло.
  • Попытка сконфигурировать профиль cobertura в моем файле Maven pom для управления классами, но (в Maven 3) я получаю
    • Целая куча предупреждений о log4j и ant, имеющих атрибуты InnerClasses, и что я должен перекомпилировать их из источника
    • Ошибка, которая com.jayway.maven.plugins.android.generation2: android-maven-plugin: 3.3.0: dex "ANDROID-040-001: Не удалось выполнить: Command = / bin / sh -c -cd / path / To / myproject && java -jar $ ANDOID_HOME / platform-tools / lib / dx.jar –dex … "

 EXCEPTION FROM SIMULATION: local variable type mismatch: attempt to set or access a value of type java.lang.Class using a local variable of type java.lang.reflect.Type[]. This is symptomatic of .class transformation tools that ignore local variable information. 

… возможно, поэтому никто не смог заставить cobertura работать на Android?

Проблема в том, что maven-android-plugin использует версию 2.1.5320 emma, тогда как в Android-приложениях используется версия 2.0.5312. Как обсуждалось здесь , эти две версии несовместимы.

Исправление состоит только в использовании одной версии для двух инструментов. Я смог заставить его работать, клонировав репозиторий maven-android-plugin , установив версию зависимости от emma на 2.0.5312 и установив ее в мой локальный репозиторий. Удостоверьтесь, что зависимость от emma в вашем проекте под-тестированием также правильна, и тогда вы должны иметь возможность создавать покрытие.

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