Выполнение покрытия кода с использованием Clover на Play!Framework приложение с использованием Ant - PullRequest
12 голосов
/ 06 июня 2011

Я пишу Ant-скрипт, чтобы выполнить дополнительные проверки в моей Play! Framework Framework.

В настоящее время я выполняю свои тесты из своего Ant-скрипта, просто выполняя exec-вызов «play auto-test».

    <exec executable="${play.dir}/play.bat">
        <arg line="auto-test"/>
    </exec>

Кто-нибудь знает, как интегрировать Clover в набор тестов Play? Очевидно, что я не привязан к тому, чтобы запускать свои тесты, используя вышеуказанное.

Я также попытался написать скрипт Ant, используя традиционный способ выполнения тестов JUnit (то есть, используя цель Ant junit), и у меня возникли две проблемы:

  • При выполнении всех моих тестов, только первый будет успешно выполнен, в то время как другие потерпят неудачу по странным причинам
  • Если я просто выставлю один тест в своем наборе и успешно выполню тест, это будет означать, что охват кода составляет 0%. Затем я подумал, что неправильно настроил клевер, однако я создал простой класс, который тестировал производственный класс, который ничего не делал, и охват увеличился, как я и ожидал.

Так что, если бы я пошел по маршруту junit, мне нужно было бы знать, как выполнить все мои тесты, чтобы они могли успешно запускаться один за другим (это работает при использовании способа запуска Play play auto-test) и мне нужно знать, почему Clover, похоже, не воспринимает строки кода, затронутые тестами Play.

(я знаю, что есть модуль Cobertura для Play, однако я нахожу, что Clover лучше работает, сообщая мне точную цифру покрытия)

Обновление: К сожалению, я не могу воспроизвести точную ошибку, которую я получил раньше, поскольку у меня возникли проблемы с компиляцией, когда я пытаюсь скомпилировать вещи вручную. Я начал использовать модуль Secure, и он содержит только исходные файлы Java. Поэтому в моем скрипте Ant я вызываю play precompile, который производит байт-код для модуля Secure (а также все остальное в системе, включая мой код). Поэтому теперь, когда я пытаюсь скомпилировать код своего приложения с использованием Clover, я думаю, что компилятор немного запутался, поскольку у меня есть две версии моих классов - одна, созданная командой precompile (non-clover), и одна, созданная моим собственным. сборник муравьев (с клевером):

[javac] C:\projects\testproject\out\clover\classes\clover8583527041716431332.tmp\model\HouseTest.java:45: incompatible types
[javac] found   : play.db.jpa.JPABase
[javac] required: models.House
[javac]         __CLR2_5_115y15ygoxiz3dv.R.inc(1527);House found = House.findById(id);

Итак, у меня сейчас две проблемы:

  • Мне нужно иметь возможность скомпилировать исходный код, который также зависит от предоставляемых Play-модулей (например, CRUD, Secure), которые не имеют скомпилированных версий, поэтому я пытаюсь обойти его, вызвав play precompile себя в моем скрипте Ant
  • Как только я начну работать с компиляцией, у меня, несомненно, снова возникнет первоначальная проблема: я не смог выполнить тесты с использованием цели junit.

Обновление № 2: Оказывается, ошибка, которую я получил, была вызвана вызовом findById, требующим приведения из JPABase в House (не то, чтобы IDE или игра, казалось, заботились об этом). Поэтому после того, как я вошел и применил все методы игры "find *", я действительно получил отчеты JUnit и Clover! Однако ... Теперь я получаю два вида ошибок:

  • Классы сущностей, созданные в Play, можно создавать, расширяя класс Model, который предоставляет магические методы, такие как упомянутые выше методы find, а также метод count. Суперкласс Model фактически расширяет GenericModel, который реализует эти методы, генерируя исключение UnsupportedOperationException. Так что, очевидно, играть! делает еще немного магии за кулисами, чтобы обеспечить фактическую реализацию этих методов. К сожалению, мои тесты (и производственный код) основаны на таких методах, как count, но они выдают исключение в моем сценарии ant / junit (примечание: все работает нормально при выполнении play auto-test.

  • Другая ошибка, которую я получаю, связана с тем, что я использую модуль Spring. В одном из моих классов (корневой класс) я звоню Spring.getBeanOfType(Some.class). Сейчас я использую автосканирование, но в среде тестирования ant / junit модуль Spring еще не настроил мой контейнер Spring, и поэтому вызов просто возвращает ноль.

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

1 Ответ

4 голосов
/ 17 июня 2011

Clover выполняет инструментарий на уровне исходного кода, поэтому ему необходим исходный код. Все, что вы делаете перед активацией клевера, который генерирует байт-код, не будет "засвечено".

Clover для ant перехватывает вызовы ant-компилятора, поэтому, если вы выполните <clover-setup/> перед любыми другими задачами компиляции в вашем скрипте ant, все должно быть оснащено клевером.

Вы можете выполнить полученный скомпилированный код любым удобным вам способом, например, выполнение из скрипта или из junit, это не имеет значения, пока код инструментирован (и, конечно, clover.jar доступен в classpath). Clover жестко кодирует местоположение базы данных Clover в инструментированном коде, поэтому вам не нужно ничего указывать при выполнении.

Было бы действительно полезно, если бы вы могли обрисовать в общих чертах, как вы используете клевер, и вы могли бы также провести перепроверку документации клевера в http://confluence.atlassian.com/display/CLOVER/1.+QuickStart+Guide.

...