Эмма сообщает 0% охват - PullRequest
2 голосов
/ 03 июня 2011

Я хочу получить покрытие кода при запуске модульных тестов. Я запускаю ant coverage, используя стандартный android build.xml для тестов.

Тесты проходят хорошо. Последние строки из ant coverage:

Tests run: 59,  Failures: 1,  Errors: 4

Generated code coverage data to /data/data/my.package/files/coverage.ec

Но файл cover.ec имеет длину всего 37 байт и почти пуст.

Запуск отчета Эммы об этом говорит

no collected coverage data found in any of the data files [all reports will be empty]

и генерирует прекрасный отчет с НУЛЯМИ в каждом поле.

Полагаю, эмма должна генерировать большее покрытие .ec.

Что я делаю не так?

--- обновление ---

Глубоко копал. Кажется, что большинство вещей хорошо, кроме генерации результата покрытия.

1) компилирует все, говоря

[javac] /blabla/android-sdk-linux_x86/tools/ant/main_rules.xml:384: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 88 source files to /blabla/project/tests/instrumented/classes
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.

2) Он делает <instr> с mode="overwrite" для проекта, который находится в стадии тестирования. Путь в порядке.

-emma-инструмент: [echo] Инструментарий классов из /blabla/project/tests/instrumented/classes...

В результате получается файл * .em с метаданными для 98 классов.

3) Некоторая стандартная конвертация Android в dex, пакет в unaligned, выравнивание по zip. Результат - /blabla/project/tests/instrumented/project-debug.apk.

4) Установка этого проекта-debug.apk на эмулятор.

5) Составление тестового проекта. компиляции: [javac] /blabla/android-sdk/android-sdk-linux_x86/tools/ant/main_rules.xml:384: предупреждение: «includeantruntime» не установлено, по умолчанию build.sysclasspath = last; установить в false для повторяющихся сборок [javac] Компиляция 110 исходных файлов в / blabla / project / tests / bin / classes

Исходные файлы включают все предыдущие файлы плюс тесты (110 = 88 + тесты), как указано в build.properties (несколько source.dir, разделенных ";").

6) Ресурсы, Dex, подпись, выравнивание по zip ... Результат - projectTest-debug.apk

7) Установка projectTest-debug.apk на эмулятор.

8) Проведение тестов до утра, где указано «покрытие на». Это говорит о том, что

[exec] Generated code coverage data to /data/data/blabla.project/files/coverage.ec

9). В этом файле cover.ec нет соответствующих данных. Это 37 байтов в длину. Отчет об этом говорит, что

processing input file [/home/ubuntu/projects/ppf2/workspace/PPF2/tests/coverage.ec] ...
loaded 0 coverage data entries
...
no collected coverage data found in any of the data files [all reports will be empty]

Мне кажется, все хорошо, кроме последнего шага.

Ответы [ 2 ]

3 голосов
/ 21 ноября 2013

Я столкнулся с той же проблемой и думаю, что понимаю, что здесь произошло.

Мне кажется, что источники тестируемого пакета также были внутри (или упоминались как источники) тестового пакета.

В результате ваши пакеты будут выглядеть следующим образом, если вы откроете их :

PackageUnderTest/ClassFileUnderTest

TestPackage/TestClass
TestPackage/ClassFileUnderTest

ClassFileUnderTest:

pluclic class ClassFileUnderTest{
    public int foo(){
       ...
    }
}

TestClass:

pluclic class TestClass{
    public void testFoo(){
       int result = foo();
       assert...
    }
}

Здесь происходит то, что всякий раз, когда ваш TestClass вызывал метод foo () из testFoo (), foo () вызывался для TestClass / ClassFileUnderTest вместо PackageUnderTest / ClassFileUnderTest.

В результате экземплярный PackageUnderTest / ClassFileUnderTest никогда не запускался и не учитывался в отчете о покрытии.

Удаление ссылочного кода PackageUnderTest из TestPackage привело к тому, что код PackageUnderTest был запущен из PackageUnderTest и подсчитан вотчет о покрытии.

0 голосов
/ 08 июня 2011

Наконец, после многих часов борьбы, вопрос решен.Разрешение очень простое и неожиданное.

В build.properties проекта TEST у меня было что-то вроде:

tested.project.dir=..
env.WORKSPACE= /bla/bla
source.dir=${env.WORKSPACE}/first/src;${env.WORKSPACE}/second/src;${env.WORKSPACE}/andsoon/src;

Но!Я не должен указывать source.dir здесь!Для успешного компиляции тестового проекта достаточно указать tested.project.dir.

Более того, если я укажу source.dir в проекте TEST следующим образом - тесты пройдут хорошо, но emma сообщит об отсутствии покрытия, как указано в вопросе.

...