Gradle crea TEST-junit.framework.TestSuite$1.xml cuando no hay método de prueba

Tengo una clase de prueba que en realidad no tiene pruebas

public class TestNumbers3EmptyTest extends TestCase {

    public void TestNumbers3EmptyTest () {
    }

    public void noddInJunit3(){
                 //nothing needed here
    }
}

Prueba de carreras de Gradle pero crea un archivo

build\test-results\test\TEST-junit.framework.TestSuite$1.xml

Contenido del archivo

xml version="1.0" encoding="UTF-8"?

  
  
    junit.framework.AssertionFailedError: No tests found in org.sample.numberutils.TestNumbers3EmptyTest
    at junit.framework.Assert.fail(Assert.java:57)
    at junit.framework.TestCase.fail(TestCase.java:223)
    at junit.framework.TestSuite$1.runTest(TestSuite.java:96)
    at junit.framework.TestCase.runBare(TestCase.java:142)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:130)
    at junit.framework.TestSuite.runTest(TestSuite.java:241)
    at junit.framework.TestSuite.run(TestSuite.java:236)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
    at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.base/java.lang.Thread.run(Thread.java:834)

  
  
  

Informe HTML de Gradle también utiliza el nombre de clase "incorrecto"

De alguna manera el nombre de la prueba se convierte en "junit.framework.TestSuite$1". ¿Cómo puedo hacer gradle escribir el nombre de clase correcto y utilizar el nombre de archivo correcto?

enter image description here

(Tenemos un marco que ejecuta las pruebas a través de muchas máquinas. El nombre de archivo y el nombre de testclass son información importante para el marco para hacer limpieza/retry, etc.)

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codealchemy


2 Respuestas:

  • El problema que estás experimentando se debe a que JUnit3 no reconoce correctamente los métodos de prueba en tu clase de prueba. En JUnit3, los métodos de prueba deben seguir un formato específico: comenzar con la palabra "test" seguida de cualquier otro nombre.

    Para solucionar este problema, debes realizar los siguientes cambios en tu clase de prueba:

    • Cambia el nombre del constructor de la clase de prueba para que coincida con el nombre de la clase (en este caso, TestNumbers3EmptyTest). Debe ser un constructor público y no debe tener un tipo de retorno.
    • Cambia el nombre del método de prueba noddInJunit3 a comenzar con la palabra "test" (por ejemplo, testNoddInJunit3).

    Aquí está cómo podría quedar tu clase de prueba corregida:

    java
    public class TestNumbers3EmptyTest extends TestCase {
    
        public TestNumbers3EmptyTest() {
            super();
        }
    
        public void testNoddInJunit3() {
            // No se necesita nada aquí
        }
    }
    

    Con estos cambios, Gradle debería reconocer correctamente tu clase de prueba y ya no debería generar el archivo TEST-junit.framework.TestSuite$1.xml.

    Una vez que realices estos cambios, vuelve a ejecutar las pruebas para verificar que el problema se ha resuelto.

    Respondida el Dec 18, 2020 a las 08:36 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Causa del problema

    Gradle genera un archivo TEST-junit.framework.TestSuite$1.xml cuando encuentra una clase de prueba sin métodos de prueba porque JUnit 3 (que usa Gradle) crea un TestSuite con un nombre compuesto por el nombre de la clase y $1.

    Solución

    Para resolver este problema, puedes hacer lo siguiente:

    • Añade un método de prueba vacío a tu clase de prueba:

    Agrega un método de prueba vacío, como el siguiente, a tu clase de prueba TestNumbers3EmptyTest:

    java
       @Test
       public void emptyTest() {
       }
       

    • Utiliza la anotación `@Ignore` para ignorar la clase de prueba:

    Si no deseas agregar un método de prueba vacío, puedes ignorar la clase de prueba usando la anotación @Ignore de JUnit:

    java
       @Ignore
       public class TestNumbers3EmptyTest extends TestCase {

    public void TestNumbers3EmptyTest () { }

    public void noddInJunit3(){ //nothing needed here } }

    • Actualiza la versión del complemento JUnit de Gradle:

    Asegúrate de estar utilizando una versión reciente del complemento JUnit de Gradle. Las versiones más recientes pueden manejar mejor las clases de prueba sin métodos de prueba. Actualiza el complemento en tu archivo build.gradle:

    groovy
       plugins {
           id 'org.junit.platform.gradle.plugin' version '1.9.0'
       }
       

    Archivos de resultado correctos

    Después de aplicar una de estas soluciones, Gradle debería generar archivos de resultados con el nombre de clase y el nombre de archivo correctos para tu clase de prueba.

    Archivo XML de resultados: TEST-org.sample.numberutils.TestNumbers3EmptyTest.xml Nombre de la clase en el informe HTML: org.sample.numberutils.TestNumbers3EmptyTest

    Respondida el Dec 18, 2020 a las 08:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0