Pregunta

Mi empresa está en medio de la actualización de nuestro sistema de compilación para usar Buckminster (que ha ido bien). Naturalmente, a los gerentes les gustaría que pudiéramos generar automáticamente algunas de las métricas que usan para el código mientras estamos en ello; una de estas métricas es la cobertura de las pruebas unitarias.

La compilación anterior, que estaba basada en PDE, dio como resultado una aplicación sin cabeza separada que analiza todos los complementos en el contexto, busca dentro de ellos las clases de prueba, arroja todos los casos de prueba en un conjunto más grande y luego lo ejecuta mediante programación, a través de JUnitResultFormatter.startTestSuite(). En el proceso, agrega algunas pruebas de cosecha propia para metadatos particulares (marcas de derechos de autor, etc.) y pruebas para la dependencia del paquete.

Parece que debería poder exportar el producto para la aplicación de prueba, instrumentarlo con la herramienta de cobertura que elija y luego ejecutarlo; sin embargo, parece que ambas herramientas de cobertura quieren saber todo el classpath con el que están lidiando. ¿Es posible hacer que cualquiera de estas herramientas funcione bien sin rastrear todo mi espacio de trabajo de construcción para jarras y dependencias?

¿Fue útil?

Solución

Gestionado para que todo funcione, con la ayuda de una pregunta SO anterior.

Comenzamos con esta publicación , que nos proporcionó un ejemplo de configuración de cobertura con EMMA. Sin embargo, parecía que tendríamos que forzar una dependencia de EMMA en cada complemento para el que queríamos obtener datos de cobertura.

Algunos forenses de Google nos llevaron a este extracto del libro , que cubre adecuadamente la jerarquía del cargador de clases OSGi. Al agregar la línea osgi.parentClassloader=app al config.ini de la aplicación en ejecución de prueba, podríamos especificar un classpath en la línea de comandos. Ese classpath necesitaba incluir:

  • Eclipse's startup.jar
  • Los archivos Java SDK utilizados por la aplicación
  • Los frascos para la herramienta de cobertura

Por supuesto, estábamos ejecutando las pruebas a través de la tarea <java jar="foo.jar"> Ant, que ignora silenciosamente cualquier información de classpath que proporcione y utiliza solo el jar. Después de que Emma trabajara, cambiamos a Cobertura, y nuestro guión final de Ant (ligeramente abreviado y anónimo) se ve así:

<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>

Espero que esto ayude a alguien que está en el mismo lugar en el que estábamos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top