Подтвердить что ты не робот

Выполнение кода с использованием Clover в Play! Рамочное приложение с использованием Ant

Я пишу Ant script для выполнения дополнительных дополнительных проверок в моей Play! Рамочное приложение.

В настоящее время я выполняю свои тесты из своего Ant script, просто делая вызов exec для "воспроизведения автотеста".

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

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

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

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

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

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

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

[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 script
  • Как только я получу компиляцию, у меня, несомненно, снова будет моя оригинальная проблема - не выполнить тесты, используя цель junit.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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