Содержание


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

Comments

Методология непрерывной разработки программного обеспечения предусматривает индивидуальную разработку каждой новой функциональности и последующую ее интеграцию в общую систему. Следуя данной методике, каждый разработчик должен тщательно проверять исходный код, применяя статический анализ, и отправлять отчеты или фиксировать свои действия в такой системе как 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