Содержание


Интеграция FindBugs, CheckStyle и Cobertura с системой сборки Rational Team Concert

Методология непрерывной разработки программного обеспечения предусматривает индивидуальную разработку каждой новой функциональности и последующую ее интеграцию в общую систему. Следуя данной методике, каждый разработчик должен тщательно проверять исходный код, применяя статический анализ, и отправлять отчеты или фиксировать свои действия в такой системе как IBM Rational Team Concert™. Язык программирования Java имеет более 400 стандартных типов статических ошибок. Исправление всех ошибок во время проверки кода и фиксация каждой из них является очень непростой задачей.

Интеграция FindBugs, CheckStyle и Unit Test Coverage Check (Cobertura) с системой Rational Team Concert сокращает процесс проверки поставляемого кода в рамках проекта. Некоторые разработчики не знают о передовых методиках написания кода. Это может привести к возникновению таких проблем производительности, как утечка памяти или неэффективное использование ресурсов процессора. Проблемы такого типа обнаруживаются автоматически при интеграции инструментария с Rational Team Concert, который создает для них уведомления о неисправностях.

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

Общая схема и описани

Чтобы понять детали реализации, рассмотрим Rational Team Concert в качестве базовой системы. Это означает, что мы рассматриваем механизм сборки, репозиторий исходных кодов и систему заявок как единый модуль. На рисунках 1 и 2 показано, как Rational Team Concert позволяет заказывать компоновку настроенных ранее действий с репозиторием исходных кодов посредством механизма сборки. В эти настроенные действия по компоновке мы и хотим добавить сценарии для запуска инструментов контроля качества. Эти инструменты можно запускать в последовательном или параллельном режимах. Поскольку они независимы друг от друга, я предпочитаю выполнять их параллельно. Система Cobertura работает с модульным тестированием, выполняющимся во время сборки, поэтому ее необходимо запускать одновременно с модульным тестированием.

Рисунок 1. Схема компонентов интеграции
Схема компонентов интеграции
Схема компонентов интеграции
Рисунок 2. Блок-схема интеграции инструментов
Блок-схема интеграции инструментов
Блок-схема интеграции инструментов

Разумная реализация отдельных инструментов и детали интеграции

FindBugs

FindBugs – это программа с открытыми исходными кодами, созданная Биллом Пью (Bill Pugh) и Дэвидом Хоумайером (David Howemeyer). Она выполняет поиск ошибок в исходном коде Java. Эта программа путем статического анализа идентифицирует сотни видов потенциальных ошибок в Java-программах. Потенциальные ошибки подразделяются на четыре категории: scariest (ужасные), scary (плохие), troubling (вызывающие тревогу) и of concern (заслуживающие внимания). Мы предлагаем запускать ее на этапе настройки maven-сборки.

Интеграция FindBugs с Rational Team Concert

  1. Добавьте в файл сборки проекта запись о программе FindBugs, которая будет запускать FindBugs во время сборки проекта. В листинге 1 приведен XML-фрагмент файла сборки, активизирующий FindBugs и генерирующий выходной файл с HTML-отчетом.
Листинг 1. Запуск FindBugs во время сборки с построчными комментариями
  <tasks>
1    <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath" />
     <mkdir dir="${basedir}/target" />
2    <property name="findbugs.home" value="${env.FINDBUGS_HOME}" />
3    <path id="findbugs.lib" >
       <fileset dir="${findbugs.home}/lib" >
         <include name="**/*.jar" />
       </fileset>
     </path>
4    <property name="proj.file" value="project.fbp" />
5    <property name="current.scan" value="target/scan-out.xml" />
6    <property name="temp.db" value="target/temp-db.xml" />
7    <property name="report.file" value="target/findbugs-report.html" />

     <!-- сканирование указанного исходного кода -->
8    <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask">
       <classpath refid="findbugs.lib" />
     </taskdef>
9    <findbugs home="${findbugs.home}" 
        projectFile="${proj.file}"
        excludeFilter="excludes.xml"
        includeFilter="includes.xml"
        output="xml" 
        outputFile="${current.scan}" />

     <!-- завершение генерирования HTML-отчета из временной базы данных -->
10   <taskdef name="convertXmlToText" classname=
        "edu.umd.cs.findbugs.anttask.ConvertXmlToTextTask">
       <classpath refid="findbugs.lib" />
     </taskdef>
11   <convertXmlToText home="${findbugs.home}" 
       input="${temp.db}" 
       output="${report.file}" 
       format="html:fancy-hist.xsl" 
       jvmargs="-Djavax.xml.transform.TransformerFactory=
        org.apache.xalan.processor.TransformerFactoryImpl" />
  </tasks>

Рассмотрим листинг 1 более внимательно

  • Строка 1. Указывает источник определения задания, который ссылается на classpath из maven: maven.plugin.classpath.
  • Строка 2. Определяет домашнюю папку FindBugs, указывающую на исполняемые файлы и библиотеки FindBugs.
  • Строка 3. Включает все .jar-файлы из домашней папки FindBugs. Они будут использоваться в дальнейшей работе.
  • Строка 4. Определяет расположение файлов проекта, в которых должна содержаться вся информация о проекте. Пример рассматривается в следующем разделе.
  • Строка 5. Определяет местоположение выходного XML-файла как scan-out.xml.
  • Строка 6. Определяет файл базы данных для хранения ошибок.
  • Строка 7. Определяет месторасположение файла отчета.
  • Строка 8. Определение задания FindBugs (объявление).
  • Строка 9. Выполнение программы FindBugs.
  • Строка 10. Определение задания генерации отчета (объявление).
  • Строка 11. Генерирование отчета. При этом данные преобразуются из XML в HTML.

Файл проекта (project.fbp) должен содержать информацию, приведенную в листинге 2. В нем перечисляются все сканируемые папки классов, соответствующие .jar-файлы, использующиеся для компиляции этих классов, и папки с исходным кодом классов.

Листинг 2. Пример файла project.fb
<Project projectName="MyProject">
  <Jar>../MyProject/target/classes</Jar>
  <AuxClasspathEntry>../MyProject/lib/servlet-api-2.5.jar</AuxClasspathEntry>
  <SrcDir>../MyProject/src</SrcDir>
</Project>
  1. Файл scan-out.xml содержит выходную информацию программы FindBugs по итогам анализа проекта. В листинге 3 приведен пример такого файла
Листинг 3. Пример файла scan-out.xml
<BugInstance type="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" priority="2" abbrev="UrF" 
category="STYLE">
  <Class classname="com.ibm.myproject.task.Process">
    <SourceLine classname="com.ibm.myproject.task.Process" start="21" end="57" 
    sourcefile="Process.java" sourcepath="com/ibm/myproject/task/Process.java"/>
  </Class>
  <Field classname="com.ibm.myproject.task.Process" name="conn" signature=
    "Lcom/com/ibm/myproject/task/Connection;" isStatic="false">
    <SourceLine classname="com.ibm.myproject.task.Process" sourcefile="MyHTTP.java" 
    sourcepath="com/ibm/myproject/task/Process.java"/>
  </Field>
  <SourceLine classname="com.ibm.myproject.task.Process" start="25" end="25" 
    startBytecode="11" endBytecode="11" sourcefile="Process.java" sourcepath=
    "com/ibm/myproject/task/Process.java"/>
</BugInstance>
  1. Создайте текстовый файл BugSet.txt, содержащий по одной строке для каждой ошибки, указанной в scan-out.xml. Для этого используйте XSL или языки сценариев.
  2. Преобразуйте каждую ошибку из текстового файла BugSet в JSON-формат Rational Team Concert WorkItem и отправьте его в Rational Team Concert, используя функцию автоматической заявки, которая будет рассмотрена ниже.

CheckStyle

CheckStyle – это программа статического анализа исходного кода, используемая при разработке программного обеспечения для проверки соответствия правилам написания исходного Java-кода.

Интеграция CheckStyle с Rational Team Concert

  1. Добавьте в файл сборки проекта запись о программе CheckStyle, которая будет запускать CheckStyle во время сборки проекта. В листинге 1 приведен XML-фрагмент файла сборки, активизирующий CheckStyle и генерирующий выходной файл с HTML-отчетом.
Листинг 4. Запуск CheckStyle во время сборки с построчными комментариями
 <tasks>
1  <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref=
    "maven.plugin.classpath" />
    <mkdir dir="${basedir}/target" />
	
2  <property name="checkstyle.home" value="${env.CHECKSTYLE_HOME}" />
3  <path id="checkstyle.lib" >
     <fileset dir="${checkstyle.home}" >
       <include name="**/*.jar" />
     </fileset>
   </path>
									
4  <property name="config_loc" value="${env.BUILD_SCRIPTS}/common/checkstyle" /> 
    <!-- это для того, чтобы Eclipse-CS смог найти excludes.xml -->
5  <property name="target.dir" value="${basedir}/target" />
6  <property name="scan.xml" value="${target.dir}/scan.xml" />
									
   <taskdef resource="checkstyletask.properties" classpathref="checkstyle.lib"/>
	
   <!-- Задание: Scan	-->
7  <checkstyle config="${config_loc}/myproject-checkStyle-config.xml" classpathref=
    "checkstyle.lib" failOnViolation="false">
     <fileset dir="${env.BUILD_HOME}/myproject/src" includes="**/*.java" />	
     <formatter type="xml" toFile="${scan.xml}" />
   </checkstyle>
 </tasks>

Рассмотрим листинг 4 более внимательно

  • Строка 1. Указывает источник определения задания, который ссылается на classpath из maven: maven.plugin.classpath.
  • Строка 2. Определяет домашнюю папку CheckStyle, указывающую на исполняемые файлы и библиотеки CheckStyle.
  • Строка 3. Включает все .jar-файлы из домашней папки CheckStyle, которые будут использоваться в дальнейшей работе.
  • Строка 4. Определяет местоположение папки config, в которой находятся конфигурационные файлы, например excludes.xml.
  • Строка 5. Определяет целевой каталог, в котором будут размещаться все генерируемые файлы.
  • Строка 6. Определяет местоположение выходного XML-файла. В данном примере это scan.xml.
  • Строка 7. Выполняет фактическое сканирование указанной папки с исходными кодами. Сканируются только Java-файлы. Выходная информация генерируется в XML-формате. В данном примере данные пишутся в scan.xml.
  1. Программа checkstyle генерирует подробную выходную информацию, которую можно извлечь при помощи XSL-преобразования. Пример XSL-файла приведен в листинге 5. В примере сгенерирован .txt-файл, содержащий список ошибок.
Листинг 5. Пример XSL-файла
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="ISO-8859-1" indent="no" />
<xsl:template match="/">
  <!-- проходим в цикле по всем указанным файлам -->
  <xsl:for-each select="checkstyle/file">
    <xsl:variable name="fname" select="@name" />
    <!-- проходим в цикле по всем ошибкам в файле -->
    <xsl:for-each select="error">
      <xsl:variable name="errtype">
        <xsl:choose>
          <xsl:when test=
            "@source='com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocMethodCheck'">
            Javadoc</xsl:when>
          <xsl:when test=
            "@source='com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocStyleCheck'">
            Javadoc</xsl:when>
          <xsl:otherwise>Other</xsl:otherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:value-of select="$errtype" /><xsl:text> problem(s) in 
      </xsl:text><xsl:value-of select="$fname"/><xsl:text>
</xsl:text>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
  1. Преобразуйте каждую ошибку из текстового файла DefectSet в JSON-формат Rational Team Concert WorkItem и отправьте ее в Rational Team Concert, используя функцию автоматической заявки, которая будет рассмотрена ниже.

Cobertura

Cobertura – это программа с открытыми исходными кодами, предназначенная для измерения покрытия кода (code coverage) путем его тестирования. Она работает с байт-кодом. Эта программа основана на инструменте jcoverage. Она помогает программистам измерять эффективность тестов и объем исходного кода, охватываемого тестами.

Интеграция Cobertura с Rational Team Concert

Добавьте в файл сборки проекта запись о программе Cobertura, которая будет запускать Cobertura во время сборки проекта. В листинге 1 приведен XML-фрагмент файла сборки, активизирующий Cobertura и генерирующий выходной файл с HTML-отчетом.

Листинг 6. Запуск Cobertura во время сборки
 <tasks>
1  <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref=
    "maven.plugin.classpath" />
   <mkdir dir="${project.build.directory}/coverage"/>
2  <taskdef name="cobertura-report" classname="net.sourceforge.cobertura.ant.ReportTask" 
    classpathref="maven.compile.classpath"/>
3  <cobertura-report datafile="${project.build.directory}/cobertura.ser" format="xml"
     destdir="${project.build.directory}/coverage/xml">
     <fileset dir="${basedir}/../myproject/app1/src">
       <include name="**/*.java" />
     </fileset>
   </cobertura-report>
 </tasks>

Рассмотрим листинг 6 более внимательно.

  • Строка 1. Указывает источник определения задания, который ссылается на classpath из maven: maven.plugin.classpath.
  • Строка 2. Определяет задание Cobertura.
  • Строка 3. Генератор XML-отчетов Cobertura работает с файлом cobertura.ser, в котором сохраняются данные анализа.

Система автоматической подачи заявок Rational Team Concert

  1. Создайте JSON для каждой строки текстового файла, которые генерируются для каждой обнаруженной ошибки. В листинге 7 приведен пример JSON-шаблона.
Листинг 7. JSON с ошибками для Rational Team Concert
{
  "dc:title":"[Static Analysis] @BUGSUBJ@",
  "dc:description":"@BUGSUBJ@<br\/><br\/>This problem was found in build: 
  @BUILDID@.<br\/>
  <br\/>Please see the FindBugs report attached to the above build for more 
  details;<br\/>
  1. in Rational Team Concert client, go to Team Artifacts > My Project > 
  Builds<br\/>
  2. find the build definition: @BLDDEFN@, and double click it<br\/>
  3. in the Builds view that opens, find a build with the 'Label' value matching the 
  build# above, and double click it<br\/>
  4. in the Build Result that opens, go to the 'Downloads' tab, and double click the 
  'logs' in the list<br\/>
  5. now your browser should come up, and you just click the 
  findbugs-myproject.html<br\/>"
	
  "rtc_cm:plannedFor":
  {
    "_comment":"Specifies 'Development' as planned-for for the ticket",
    "rdf:resource":"https://myjazzrtc.ibm.com:9000/ccm/oslc/iterations/
    _gMAnkOlIEeKwsc_eM5wLCA"
  },
  "rtc_cm:ownedBy":
  {
    "_comment":"Specifies 'Developer1' (=_0k3H0MheEeKc1_BomI__Fw) as the 
    owner of the ticket",
    "rdf:resource":"https://myjazzrtc.ibm.com:9000/ccm/oslc/users/_0k3H0MheEeKc1_BomI__Fw"
  }
}
  1. Файл сценария считывает каждую строку текстового файла отчета об ошибках и вызывает REST API Rational Team Concert для создания уведомлений об ошибках.

В листинге 8 приведен пример сценария.

Листинг 8. Сценарий REST-вызовов Rational Team Concert
# поместить динамическую информацию в полезную нагрузку
BUGDESC=`cat $QTXT1`
BLDDEFN=`grep ^buildDefinitionId= $BUILD_HOME/jazz.properties | awk -F= '{print $2}'`
BUILDID=`grep ^buildLabel= $BUILD_HOME/jazz.properties | awk -F= '{print $2}'`
sed -e "s%@BUGSUBJ@%$BUGDESC%g" -e "s/@BUILDID@/$BUILDID/g" -e "s/@BLDDEFN@/$BLDDEFN/g" 
new-defect.json >$PAYLOAD
PLSZ=`wc $PAYLOAD | awk '{print $3}'`
if [ $PLSZ -lt 1000 ]; then
  echo "...well, payload seems too small to be valid - please check.."
  cat $PAYLOAD
fi

# вызвать REST API
curl -s -D - -k -b $COOKIES -H "Content-Type: application/x-oslc-cm-change-request+
json" -H "Accept: text/xml" -X POST --data-binary @$PAYLOAD $HOST/oslc/contexts/$PROJ/
workitems >$JAZRESP

Заключение

FindBugs, Cobertura, CheckStyle – это популярные инструментальные программы для проверки качества исходного кода. Их интеграция с Rational Team Concert помогает программистам повысить качество кода. Благодаря простоте генерации уведомлений об ошибках устраняется необходимость ручного вмешательства и выполнения дополнительной работы. Интеграция с Rational Team Concert особенно полезна начинающим программистам, поскольку учит написанию эффективного кода.


Ресурсы для скачивания


Похожие темы

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Rational, Технология Java
ArticleID=1013208
ArticleTitle=Интеграция FindBugs, CheckStyle и Cobertura с системой сборки Rational Team Concert
publish-date=08142015