Pergunta

Minha empresa está no meio de atualizar nosso sistema de compilação para usar Buckminster (que tem corrido bem). Naturalmente, os gestores gostaria que pudéssemos gerar automaticamente algumas das métricas que eles usam para o código enquanto estamos no assunto -. Uma destas métricas é a cobertura para os testes de unidade

A compilação anterior, que era baseada no PDE, resultou em uma aplicação sem cabeça separada que analisa através de todos os plugins no contexto, olha para dentro deles para classes de teste, joga todos os casos de teste em um conjunto maior, e então executá-lo por meio de programação, JUnitResultFormatter.startTestSuite() via. No processo ele adiciona alguns testes caseiros para determinado metadados (marcas de direitos autorais, etc) e testes de dependência de pacotes.

Parece que eu deveria ser capaz de simplesmente exportar o produto para o aplicativo de teste, instrumento-lo com a ferramenta de cobertura de minha escolha, e depois executá-lo; no entanto, parece que tanto as ferramentas de cobertura quer saber todo o classpath eles estão lidando. É possível fazer qualquer uma dessas ferramentas de jogar bonito sem arrasto toda a minha área de trabalho de compilação de frascos e dependências?

Foi útil?

Solução

Conseguimos obter tudo funcionando, com a ajuda de uma pergunta SO mais.

Começamos com este post , que nos forneceu uma configuração de exemplo a cobertura usando EMMA. No entanto, parecia que tínhamos necessidade de forçar uma dependência EMMA em cada plug-in que queríamos para obter dados de cobertura para.

Alguns forense do Google nos levou a este livro trecho , que em vez cubra adequadamente o carregador de classe hierarquia OSGi. Ao adicionar a linha osgi.parentClassloader=app ao config.ini do aplicativo de teste em funcionamento, poderíamos especificar um caminho de classe na linha de comando. Isso classpath necessária para incluem:

  • startup.jar do Eclipse
  • Os frascos Java SDK utilizados pela aplicação
  • Os frascos para a ferramenta de cobertura

É claro, nós estávamos correndo os testes via a tarefa Ant <java jar="foo.jar">, o que silenciosamente ignora qualquer informação classpath você fornecer e usos apenas o frasco. Após temos Emma trabalho, nós mudamos para Cobertura, e nosso script Ant final (ligeiramente abreviado e anónimos) se parece com:

<target name="generate.coverage" depends="buckminster.init">
  <!-- Generate the classpath. -->
  <path id="cobertura.classpath">
    <fileset dir="${tasks.dir}/lib/cobertura">
      <include name="cobertura.jar" />
      <include name="**/*.jar" />
    </fileset>
  </path>
  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

  <!-- Get ready to run the unit tests app, and delete old coverage data. -->
  <unzip src="${test-app.artifact}" dest="${output.dir}" overwrite="true" />
  <delete file="${output.dir}/cobertura.ser" />

  <!-- Instrument the jars in-place. Make sure to only capture what you want instrumented! -->
  <cobertura-instrument datafile="${output.dir}/cobertura.ser">
    <fileset dir="${output.dir}/test-app/plugins">
      <include name="**/*our.company_*.jar" />
    </fileset>
  </cobertura-instrument>

  <!-- Run the unit test application, by classname rather than by jar. -->
  <java fork="true" classname="org.eclipse.equinox.launcher.Main" logerror="true" failonerror="true" maxmemory="1G">
    <classpath>
      <pathelement location="${output.dir}/test-app/startup.jar" />
      <pathelement location="${tasks.dir}/lib/cobertura/cobertura.jar" />
      <fileset dir="${tasks.dir}/lib/cobertura">
        <include name="**/*.jar" />
      </fileset>
      <pathelement location="${java.class.path}" />
    </classpath>
    <sysproperty key="net.sourceforge.cobertura.datafile" file="${output.dir}/cobertura.ser" />            
    <arg value="-data" />
    <arg value="${output.dir}/test-app/workspace" />
    <arg value="--formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter:${log.dir}/test-results.xml" />
  </java>

  <!-- Generate the coverage reports. -->
  <cobertura-report format="html" datafile="${output.dir}/cobertura.ser" destdir="${output.dir}/cobertura-report">
    <fileset dir="${workspace.dir}/plugins">
      <include name="**/*.java" />
    </fileset>
  </cobertura-report>
</target>

Esperamos que isso ajude alguém que está no mesmo ponto em que estávamos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top