sonar software rápido para herramientas gvnix desarrollo codigo aplicaciones analisis java javascript selenium code-coverage jacoco

java - software - Cómo calcular la cobertura de código de las pruebas de selenio con respecto al código de la aplicación web



herramientas para el desarrollo rápido de aplicaciones web (2)

Asegúrate de hacer esto. Tenga en cuenta que si está utilizando Gradle, Maven o ANT. Pero el siguiente concepto es muy similar a cualquier sistema de construcción.

  1. Debe tener un artefacto de aplicación .war / .ear que necesita ejecutar detrás de Tomcat / similar.
    • También debe asegurarse de haber compilado su código principal en el modo de depuración, o Jacoco no estará contento.
    • Por ejemplo, la opción -g en Java y la opción de depuración similar (si está usando groovy).


tasks.withType(Compile) { options.debug = true options.compilerArgs = ["-g"] }


  1. Digamos que tienes el .war y el uso de Tomcat. Luego, mientras se inicia Tomcat.
    • En el script de inicio de Tomcat, asegúrese de decirle a JVM de Tomcat dónde está el archivo jacocoagent.jar y de pasar otros parámetros. ÉSTE es el punto que falta PRINCIPAL en algún momento que veamos (también conocido como no adjuntar jacoco para apuntar a la sesión de JVM e intentar obtener cobertura de código).

Por ejemplo: comienzo mi script Tomcat con el siguiente parámetro pasado a Tomcat (-Dxxxx = valor de manera)

PROJ_EXTRA_JVM_OPTS=-javaagent:tomcat/jacocoagent.jar=destfile=build/jacoco/ST/jacocoST.exec,append=false

Básicamente, el script de inicio de Tomcat tendría un valor de -De parámetro =, puede pasar el parámetro anterior (Linux / Unix exportar la variable) al alcance de Tomcat / Target JVM.

La línea de parámetros anterior, cuando se envía a Tomcat, adjuntará el archivo .jar del agente JACOCO al "TARGET" (también conocido como Tomcat JVM). Aquí le está diciendo a Tomcat que busque el archivo jacocoagent.jar de un director llamado "tomcat" en su área de trabajo. Creará un archivo jacoco .exec llamado "jacocoST.exec" (también conocido como archivo jacoco exec para Selenium Test) en la carpeta de compilación / jacoco / ST (Estoy usando Gradle, por lo que Gradle crea la carpeta de "compilación" cada vez que ejecutas una compilación / compilación / test / integrationTest / customSeleniumTaskThatYouMightHaveCreated).

NOTA: Esto significa que NO tiene que especificar la sección de jacoco en la tarea de prueba (ya que se ejecutará en la JVM de sus sistemas BUILD, ya sea Gradle o Maven o ANT, lo que tenga).

//We don''t need jacoco for non-unit tests type of tasks as Jacoco won''t be able to find any coverage if done this way. Jacoco agent file needs to be attached/visible to the TARGET''s JVM (where you run your application via a .war / .ear etc). jacoco { // ... As Gradle runs Unit tests (while doing build), they run free, in the same JVM where Gradle runs the build so Unit test have visibility to the main classes in the same JVM (which Gradle is using to run the build). Thus, you can use jacoco section in Gradle for running unit tests. BUT, // ... Don''t use this section for running Integration, Acceptance, Selenium tests which run on a target JVM. Instead attach jacocoagent.jar and specify jacoco parameters to the target JVM. }

  1. Una vez que tenga su Tomcat en funcionamiento, ahora ejecute las pruebas de Selenium. NOTA: Estoy usando Jenkins en la máquina Linux / Unix y el complemento "xvfb" es muy útil, es decir, ahora puedo ejecutar las pruebas de la interfaz gráfica de usuario de Selenium en modo HEADLESS y no molestaré a ningún usuario en una máquina en la que se ejecutan las pruebas. aparece las páginas de pruebas mientras se ejecutan las pruebas de GUI.

    - Si termina usando el complemento " xvfb " en Jenkins, PRIMERO debe iniciar el servicio " Xvfb " en el servidor (Linux / Unix) donde está ejecutando las pruebas.

    - Si está ejecutando sus pruebas no unitarias (también conocido como Integración / Selenium, etc.) en una máquina con Windows, entonces puede ver que aparecen las pruebas de la GUI cuando ejecuta las pruebas. Si no desea ver las ventanas emergentes, entonces su instancia de Jenkins puede ejecutar el proceso esclavo (su máquina de Windows) como un servicio ("Instalar como un servicio"). Si crea su máquina Windows como esclavo, cuando ejecute la instalación de JLNP en su máquina, verá una ventana emergente que indica que Jenkins ha iniciado con éxito un proceso esclavo, haciendo clic en Archivo> Instalar como un servicio ejecutará su esclavo en una máquina Windows como "sin cabeza".

  2. Mientras se ejecutan las pruebas, notará que esta vez, Jacoco creará una estructura de carpetas / archivo exec según su valor definido para el parámetro destfile , pero aún será 0 o un tamaño pequeño.

  3. Una vez que se hayan completado las pruebas de selenio / sin unidad, debe "DETENER" la JVM Tomcat / target. Esto FLUSARÁ toda la información de cobertura de jacoco en este archivo jacocoST.exec (archivo personalizado que deseaba que Jacoco creara). - Nota: Si desea que el archivo jacocoST.exec se vacíe sobre la marcha (sin necesidad de detener la sesión / TomV JVM de Tomcat, puede consultar la documentación de jacoco sobre cómo hacerlo, hay un tema allí que explica esto, De esta manera, su aplicación puede continuar ejecutándose y no tiene que detener su aplicación / servicio web).

  4. Ejecute la tarea jacocoTestReport y verá la cobertura del código jacoco.

    • Asegúrese de especificar dónde están sus fuentes / clases para el código principal.

por ej.

jacocoTestReport { group = "Reporting" description = "Generate Jacoco coverage reports after running tests." ignoreFailures = true //UT=is for Unit tests, IT=integrationTest, AT=acceptanceTest, ST=Selenium GUI tests. //executionData = files(''build/jacoco/UT/jacocoUT.exec'') //executionData = files(''build/jacoco/IT/jacocoIT.exec'') //executionData = files(''build/jacoco/UT/jacocoUT.exec'', ''build/jacoco/IT/jacocoIT.exec'') //executionData = files([''build/jacoco/UT/jacocoUT.exec'', ''build/jacoco/IT/jacocoIT.exec'']) //OR use the following way for all. executionData = fileTree(dir: ''build/jacoco'', include: ''**/*.exec'') reports { xml{ enabled true //Following value is a file destination "${buildDir}/reports/jacoco/xml/jacoco.xml" } csv.enabled false html{ enabled true //Following value is a folder destination "${buildDir}/reports/jacoco/html" } } //sourceDirectories = files(sourceSets.main.allJava.srcDirs) sourceDirectories = files(''src/java'') //sourceDirectories = files([''src/java'',''src/groovy'']) classDirectories = files(''build/classes/main'') //------------------------------------------ //additionalSourceDirs = files([''test/java'',''test/groovy'',''src/java-test'', ''src/groovy-test'']) //additionalSourceDirs += files(''src/java-test'') }

Siéntase libre de hacerme ping si todavía ve algún problema. También puede ver algunas de mis publicaciones aquí en stackoverflow sobre cómo logré esto y también publicar la misma cobertura en SonarQube.

Tengo un requisito para capturar la cobertura del código de mis pruebas de selenio a la cantidad de código fuente en el código del servidor (código fuente de la aplicación web) cubierto.

Por ejemplo, las pruebas para la funcionalidad de inicio de sesión deben capturar la cantidad de código cubierto en la aplicación web para la función de inicio de sesión.

Además, debe saber qué paquete o clase ha tocado en el código de la aplicación web para un escenario realizado. Ej. Un login

No pude encontrar una solución adecuada, aunque llegué a conocer la herramienta de cobertura de códigos Jacoco y probé algunas muestras con el uso del complemento Jacoco Jenkins, pero no tengo éxito.

No soy consciente de la posibilidad. Por favor, dame una sugerencia sobre cómo lograr esto, gracias de antemano


La manta puede funcionar.

Esta es una biblioteca de JavaScript.

Anota las importaciones en su página HTML con el atributo ''cubierta de datos'':

<script src="sourceScript.js" data-cover></script>

... y la cubierta reemplaza sus archivos JS con copias anotadas que informan estadísticas a sí mismo.

El paso no trivial es obtener las estadísticas de cobertura de código de la manta, pero si no me equivoco, Selenium tiene una interfaz que le permite ejecutar funciones de JavaScript en el motor del navegador. La API está aquí:

https://github.com/alex-seville/blanket/blob/master/docs/advanced_browser.md