После нескольких месяцев увлекательного обучения — написания первых WSDL-веб-сервисов на основе EJB 3 и JPA — я нашел время, чтобы включить в мой проект автоматизированные задачи по качеству с помощью скриптов Ant для FindBugs и PMD. Как и ожидалось, первый раунд проверки качества дал мне длинный список ошибок, большинство из которых были тривиальными ошибками, такими как непубличные поля или неиспользованные методы. После первой очистки в отчете остались некоторые ошибки, и после нескольких циклов проверки качества я получил ряд хитрых ошибок — тех, которые вы не можете себе представить, и тех, которые определенно не кажутся ошибками. В следующих разделах я расскажу об этих хитрых ошибках и способах их устранения. Я надеюсь, что вы согласны с моей стратегией, и я был бы признателен за отзыв, если вы не согласны.
Зачем использовать PMD и FindBugs?
Хорошей отправной точкой для обеспечения качества программного обеспечения является проверка того, работает ли код, как задумано, что можно сделать с помощью тестирования программного обеспечения . Несмотря на полезность тестов, они дают вам только хороший индикатор того, что код выполнит свою работу, но тесты упускают из виду пункт о детальной проверке кода (покажите мне код). Используете ли вы правильный синтаксис и структуры данных? Есть ли избыточность в коде?
Анализ правильности кода требует, чтобы человек помнил все детали о языке Java , следя за настройкой производительности — невыполнимая задача, если пытаться вручную. К счастью, такие инструменты, как PMD и FindBugs, помогают находить проблемы с кодом, а также предлагают полезные советы по оптимизации кода — эти инструменты раскрывают большинство общих проблем с кодом, экономя ваше время на более важных задачах. Если вы никогда раньше не использовали эти инструменты или не обращали на них должного внимания, вы можете предположить простую цель: цель состоит в том, чтобы минимизировать количество сообщений об ошибках в вашем коде. Чем ближе вы подойдете к отчету об отсутствии ошибок, тем лучше будет ваш код, Да, он линейный, с некоторой интерпретацией из-за различных уровней и типов ошибок, охватываемых автоматизированными инструментами (имейте в виду, что инструменты не думают, они — неназванные роботы). Установка и настройка PMD и FindBugs полностью используются в Интернете, и вместо публикации еще одного блога об этом я кратко прокомментирую недавние эксперименты, которые мы провели в проекте Cejug-Ads .
Применение PMD и FindBugs к проекту Cejug-Ads
Cejug-Объявления — это приложение J2EE с открытым исходным кодом, основанное на WSDL-первых веб-сервисах, EJB 3 и JPA, что означает проект, полный сгенерированного кода , аннотаций и обобщений, сгенерированных wsimport . Сочетание этих современных функций и технологий Java породило противоречивые ошибки в отчетах, но сначала давайте проверим код и запустим инструменты качества. Важная деталь в нашей задаче о муравьях — это зависимость от Glassfish . Поскольку наш проект зависит от типов и аннотаций J2EE, переменная окружения
Надпись: Phantom Blot предпочитает интеллектуальные игры FindBugs
Шаги для проверки кода и запуска задач качества:
|
Задачи ant генерируют два отчета, которые вы можете найти в папке /build/quality
— это стандартные отчеты PMD и FindBugs. Другая важная деталь: FindBugs потерпит неудачу в случае любой ошибки, поэтому успешное выполнение задачи означает чистый код относительно FindBugs. PMD еще не на 100% чист, потому что в отчете есть нерешенные вопросы, о которых я расскажу ниже.
Специальные советы для пользователей IDE: проект предварительно настроен для Eclipse и IDE NetBeans, но его также можно скомпилировать и протестировать из линейных команд, если вы предпочитаете этот способ.
Настройка требуется для получения кода с нулевыми ошибками в соответствии с FindBugs
-
Изменение XMLGregorianCalendar на Calendar : WSIMPORT использует JAXB для генерации классов из документов схем XSD, и по умолчанию JAXB генерирует XMLGregorianCalendar из
xsd:dateTime
определения атрибутов. Поскольку XMLGregorian календарь не является сериализуемым типом, FindBugs жалуется на это. Мы можем обойти это путем применения настройки JAXB в наших документах XSD, как описано в этой ссылке.<xsd:annotation>
<xsd:appinfo>
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Calendar"
xmlType="xsd:dateTime"
parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
printMethod="javax.xml.bind.DatatypeConverter.printDate" />
</jaxb:globalBindings>
</xsd:appinfo>
</xsd:annotation> - Удаленный интерфейс @EJB требует Serializable классов : WSIMPORT генерирует несериализуемый код из документов WSDL, но, поскольку я использую интерфейсы @Remote EJB, сообщения RMI требуют, чтобы их содержимое было Serializable. Обходной путь это снова была еще одна аннотация в схеме XSD:
<xsd:annotation>
<xsd:appinfo>
<jaxb:globalBindings>
<xjc:serializable uid="-6026937020915831338" />
<jaxb:javaType name="java.util.Calendar"
xmlType="xsd:dateTime"
parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
printMethod="javax.xml.bind.DatatypeConverter.printDate" />
</jaxb:globalBindings>
</xsd:appinfo>
</xsd:annotation>
И это все, после этих незначительных изменений FindBugs прекратил беспокоить меня об ошибках, и я получил мой 100% чистый код после FindBugs, включая сгенерированный код. FindBugs проверяет байт-код ваших классов, он использует более сложную стратегию проверки того, как работает ваш код, а не как он написан как .java
документ. Чистый код FindBugs указывает на то, что сгенерированный байт-код является надежным — это хорошее чувство для разработчиков и лучшее время для сна для руководителей проектов.
Настройка необходима для получения кода с нулевыми ошибками в соответствии с PMD
PMD было немного сложнее удовлетворить, поскольку он основан на анализе кода Java, а не на байт-коде. Немного более педантичный, чем FindBugs, PMD основан на эвристике статистики кода. Если код длинный, PMD предполагает, что он содержит ошибки, и если существует слишком много открытых методов, PMD также предполагает, что он содержит ошибки. Это попытка определить проблемы , анализируя метрики коды является спорной , но PMD был один из первых инструментов качества я научился использовать несколько лет назад, так что я решил изменить свои правила , установленные для того , чтобы продолжать использовать его в моем J2EE 5 кода. Вы можете найти результирующий файл конфигурации набора правил здесь . Помните, что Cejug-Ads находится в стадии разработки, и содержание этого файла — только наши убеждения в отношении качества нашего собственного кода .
После настройки PMD я получил отчет с нулевыми ошибками, но поскольку PMD охватывает пять различных уровней проблем, я заметил отчет о некоторых высоких предупреждениях в коде. Я все еще борюсь с ними, особенно со следующими: |
- BeanMembersShouldSerialize : это сложно, так как у меня есть вторичная проблема, связанная с этим предупреждением. Один из графических интерфейсов, использующих наши сервисы, использует FLEX, и кажется, что FLEX использует отражение для установки значений в Java-бинах. Проблема в том, что JAXB не генерирует
setters
методы для атрибутов, которые содержатmaxOccurs='unbounded'
(Коллекции). Это вызывает проблемы использования FLEX сервиса SOAP 1.1, предоставляемого JAXWS, и мы все еще ищем решение для этого. На самом деле, предупреждение PMD указывает на другое направление, но оно сохраняет полезную отметку о проблеме FLEX в нашем сервисном коде. - AvoidFieldNameMatchingTypeName : один из элементов моего XSD имеет
ref
к себе, потому что он моделирует Категории и Подкатегории. Поскольку я использую ссылку вместо создания нового атрибута, имя поля компилируется как то же имя класса. Я согласен с PMD, что это странно, поэтому я буду искать решение как можно скорее. Пока не найдено решение, предупреждение останется активным. - AbstractClassWithoutAbstractMethod : поскольку мы используем постоянный фасад JPA, мы используем класс AbstractEntity для совместного использования полей сущностей. У этого класса нет никакого метода, поскольку он используется только как суперкласс для сущностей и поэтому не имеет никакого смысла заставлять этот класс быть конкретным или иметь методы.
- UncommentedEmptyConstructor : Я наконец решил удалить это правило, поскольку JAXB генерирует пустой конструктор для всех элементов в метаданных. На мой взгляд, ничего страшного, пустые конструкторы в большинстве случаев бесполезны, но они никогда не вызывают проблем, поэтому правило кажется слишком педантичным, чтобы оставаться активным.
- UnneededParentheses : так же, как и в предыдущем примере, ненужные круглые скобки не наносят ущерба коду, так как они будут удалены компилятором. Это происходит только в сгенерированных классах и не должно быть частью серьезного анализа кода.
Вывод: я настоятельно рекомендую вам использовать PMD и FindBugs в вашем коде J2EE 5
Генерируемый код и особенно Generics требует дополнительных усилий для прохождения анализа кода, поскольку это не чисто классический код Java. Специально PMD требует большего внимания, поскольку он основан на эвристике, а не на анализе байтового кода, и он старше, чем FindBugs. Многие предположения, управляемые PMD, были созданы до того, как дженерики поддерживают Java, а некоторые просто больше не применяются. Несмотря на это, мы поняли в наших экспериментах, что оба инструмента могут использоваться вместе с хорошими результатами и никакого конфликта вообще. Если вы не используете PMD и FindBugs в своем проекте, попробуйте их сегодня — вы удивитесь, насколько быстро вы сможете улучшить качество своего кода. На самом деле, держу пари, что вы также получите зависимость от их показателей качества, особенно FindBugs.
Признание: эксперименты и усилия по достижению текущих качественных результатов были переданы Родриго Лопесу , одному из главных комментаторов Cejug-Ads.