Testng: DataProvider no ejecuta pruebas en paralelo cuando se usa Factory

Creado en 13 nov. 2018  ·  15Comentarios  ·  Fuente: cbeust/testng

Versión de TestNG

7.0.0-beta1

Comportamiento esperado

Tengo una clase que contiene un DataProvider con 5 conjuntos de datos, incluido el nombre del navegador, la versión y la plataforma, como puede ver aquí:

public class DataProviderManager {
    @DataProvider(parallel = true)
    public static Object[][] defaultWebDataProvider() {
        return new Object[][] {
                new Object[]{"chrome", "70", "Windows 10"},
                new Object[]{"internet explorer", "11", "Windows 10"},
                new Object[]{"safari", "12.0", "Mac 10.13"},
                new Object[]{"chrome", "70", "Mac 10.13"},
                new Object[]{"firefox", "63", "Mac 10.13"}
        };
    }
}

En mi clase de prueba, estoy usando Factory para pasar datos como tales:

public class MSGWebExampleTest extends BaseTest {
    // Declare page objects
    private MSGHome msgHome;
    // Declare test data

    @Factory(dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER, dataProviderClass = DataProviderManager.class)
    public MSGWebExampleTest(String browser, String browserVersion, String platform) {
        super.setRunParams(browser, browserVersion, platform);
    }

    @BeforeMethod(alwaysRun = true)
    public void setupTest() {
        msgHome = new MSGHome();
    }

    @Features({GroupProps.WEB})
    @Test(groups = {GroupProps.DEBUG})
    @Parameters({ParamProps.WEB, ParamProps.MOBILE_WEB})
    public void openSiteTest() {
        new WebInteract(null,null).pause(1000).openUrl(URLBuilder.buildUrl());
    }
}

testing.xml:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Test Engineering Core Suite" parallel="methods" thread-count="2" data-provider-thread-count="4">

Si configuro thread-count = 2 y data-provider-thread-count = 4 y paralelo = true, mi prueba debería ejecutarse 8 veces en paralelo.

Comportamiento real

Las pruebas se ejecutan secuencialmente independientemente de cuántos subprocesos intente establecer como si se ignorara paralelo = verdadero. Intenté varios intentos para que esto se ejecutara en paralelo usando el testing.xml anterior, pasando -Dthreadcount = 2 -Ddataproviderthreacount = 4 desde la línea de comandos e incluso estableciendo estos valores en la etiqueta de configuración para el complemento seguro y nada funciona.

¿El problema se puede reproducir en el corredor?

  • [x] Concha
  • [x] Maven
  • [] Gradle
  • [] Hormiga
  • [] Eclipse
  • [x] IntelliJ
  • [] NetBeans

Ejemplo de caso de prueba

Por favor, comparta el caso de prueba (lo más pequeño posible) que muestra el problema.

Question

Todos 15 comentarios

@VinceBarresi : no estoy muy seguro de cómo está diciendo que TestNG está ejecutando pruebas secuencialmente.

Modifiqué su clase de prueba para imprimir los identificadores de hilo y así es como se ve

import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;

public class MSGWebExampleTest {

  private String browser, browserVersion, platform;

  @Factory(dataProvider = "dp")
  public MSGWebExampleTest(String browser, String browserVersion, String platform) {
    this.browser = browser;
    this.browserVersion = browserVersion;
    this.platform = platform;
  }

  <strong i="8">@Test</strong>
  public void openSiteTest() {
    System.err.println("Running " + this + " on thread [" + Thread.currentThread().getId() + "]");
  }

  <strong i="9">@Override</strong>
  public String toString() {
    return String.format("[%s, %s, %s]", browser, browserVersion, platform);
  }

  @DataProvider(parallel = true, name = "dp")
  public static Object[][] defaultWebDataProvider() {
    return new Object[][]{
        new Object[]{"chrome", "70", "Windows 10"},
        new Object[]{"internet explorer", "11", "Windows 10"},
        new Object[]{"safari", "12.0", "Mac 10.13"},
        new Object[]{"chrome", "70", "Mac 10.13"},
        new Object[]{"firefox", "63", "Mac 10.13"}
    };
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Test Engineering Core Suite"
  parallel="methods"
  data-provider-thread-count="4"
  thread-count="2"
  verbose="2">
  <test name="Test Engineering Core_test">
    <classes>
      <class name="com.rationaleemotions.github.issue1951.MSGWebExampleTest"/>
    </classes>
  </test>
</suite>

La salida

...
... TestNG 7.0.0-beta1 by Cédric Beust ([email protected])
...
Running [chrome, 70, Mac 10.13] on thread [11]
Running [chrome, 70, Windows 10] on thread [12]
Running [internet explorer, 11, Windows 10] on thread [12]
Running [firefox, 63, Mac 10.13] on thread [11]
Running [safari, 12.0, Mac 10.13] on thread [12]
PASSED: openSiteTest on [chrome, 70, Mac 10.13]
PASSED: openSiteTest on [chrome, 70, Windows 10]
PASSED: openSiteTest on [internet explorer, 11, Windows 10]
PASSED: openSiteTest on [firefox, 63, Mac 10.13]
PASSED: openSiteTest on [safari, 12.0, Mac 10.13]

===============================================
    Test Engineering Core_test
    Tests run: 5, Failures: 0, Skips: 0
===============================================

===============================================
Test Engineering Core Suite
Total tests run: 5, Passes: 5, Failures: 0, Skips: 0
===============================================

Como puede ver en la salida anterior, los identificadores de subprocesos son diferentes (dos subprocesos para ser específicos ya que nuestro número de subprocesos es 2)

Su proveedor de datos en su muestra está vinculado a un método de fábrica y NO a un método @Test . Por lo tanto, no tendrá ningún papel que desempeñar en la cantidad de subprocesos que se ejecutan.

Solo cuando suceda lo siguiente:

  • un proveedor de datos se combina con un método @Test
  • el atributo paralelo de @DataProvider se establece en true
  • el atributo parallel se establece en methods en la etiqueta <suite> (o) <test>
  • data-provider-thread-count se establece con un valor superior a 1

TestNG habilitará el paralelismo y el número de métodos @Test impulsados ​​por el proveedor de datos sería igual al número de subprocesos establecidos a través del atributo data-provider-thread-count.

Nota: el atributo thread-count en el archivo xml de la suite se aplica SOLAMENTE a los métodos REGULARES y el atributo data-provider-thread-count en el archivo xml de la suite se aplica ÚNICAMENTE a un método de prueba potenciado por el proveedor de datos

Hágame saber si esa explicación tiene sentido y si este problema puede resolverse.

@krmahadevan Gracias por su respuesta detallada. Me gustaría correr yo mismo para probar esto cuando tenga la oportunidad. Tengo un par de preguntas

1: ¿El proveedor de datos (en este caso - "dp) tiene que estar en la misma clase que el @Test al que le estamos pasando el proveedor de datos para poder seguir logrando el paralelismo por data-provider-thread-count y paralelo = true? ?

2: ¿Ejecutó pruebas a nivel de suite? Si es así, ¿importa esto en términos de paralelismo? Por ejemplo, si realizo mis pruebas de grupo DEBUG a través de surefire usando mvn test -Dgroups = DEBUG, ¿necesito pasar el conteo de subprocesos del proveedor de datos a través de un parámetro en este comando?

1: ¿El proveedor de datos (en este caso, "dp) tiene que estar en la misma clase que el @Test que le estamos pasando el proveedor de datos para lograr el paralelismo por data-provider-thread-count? y paralelo = verdadero?

No es necesario. No importa dónde resida el proveedor de datos.

2: ¿Ejecutó pruebas a nivel de suite? Si es así, ¿importa esto en términos de paralelismo? Por ejemplo, si realizo mis pruebas de grupo DEBUG a través de surefire usando mvn test -Dgroups = DEBUG, ¿necesito pasar el conteo de subprocesos del proveedor de datos a través de un parámetro en este comando?

Sí, ejecuté las pruebas a nivel de suite. No debería importar. Como
siempre que el número de subprocesos del proveedor de datos esté disponible en el archivo de la suite
(el valor predeterminado si no se proporciona es 10, creo), debería funcionar
sin problemas.

@krmahadevan Así que tuve la oportunidad de probar esta mañana usando los cambios sugeridos y tener un par de observaciones.

  1. Si mantengo DataProvider en la clase de prueba y paso el nombre de DataProvider a la anotación de prueba, parece que la prueba está intentando ejecutarse en paralelo, pero veo los siguientes errores:
...
... TestNG 7.0.0-beta1 by Cédric Beust ([email protected])
...

org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.internal.reflect.MethodMatcherException: 
Data provider mismatch
Method: openSiteTest([])
Arguments: [(java.lang.String) chrome,(java.lang.String) 70,(java.lang.String) Windows 10]

    at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:40)
    at org.testng.internal.Parameters.injectParameters(Parameters.java:936)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1057)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


Test ignored.

===============================================
Test Engineering Core Suite
Total tests run: 5, Passes: 0, Failures: 5, Skips: 0
===============================================


Process finished with exit code 0

  1. Si muevo el DataProvider de nuevo a mi clase DataProviderManager.java e intento ejecutarlo con el DataProvider pasado a la anotación de prueba, parece que nuevamente intenta ejecutarse en paralelo, pero veo lo siguiente, que es un error diferente:
...
... TestNG 7.0.0-beta1 by Cédric Beust ([email protected])
...
[Utils] [ERROR] [Error] org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="7">@DataProvider</strong> named : defaultWebDataProvider
    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="8">@DataProvider</strong> named : defaultWebDataProvider
    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="9">@DataProvider</strong> named : defaultWebDataProvider
    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="10">@DataProvider</strong> named : defaultWebDataProvider
    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

[Utils] [ERROR] [Error] org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="11">@DataProvider</strong> named : defaultWebDataProvider
    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="12">@DataProvider</strong> named : defaultWebDataProvider

    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="13">@DataProvider</strong> named : defaultWebDataProvider

    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="14">@DataProvider</strong> named : defaultWebDataProvider

    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider

    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


org.testng.TestNGException: 
Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="16">@DataProvider</strong> named : defaultWebDataProvider

    at org.testng.internal.Parameters.findDataProvider(Parameters.java:614)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:808)
    at org.testng.internal.Parameters.handleParameters(Parameters.java:775)
    at org.testng.internal.ParameterHandler.handleParameters(ParameterHandler.java:60)
    at org.testng.internal.ParameterHandler.createParameters(ParameterHandler.java:39)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1024)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:140)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:122)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)


Test ignored.

===============================================
Test Engineering Core Suite
Total tests run: 5, Passes: 0, Failures: 5, Skips: 0
===============================================

Tiene alguna idea sobre esto?

¿Puede compartir el código de prueba que utilizó para activar el error?

Estoy usando el archivo testing.xml exacto que pegaste arriba (obviamente con la clase apuntando a mi clase de prueba en mi paquete). Aquí está mi DataProviderManager.java

public class DataProviderManager {
    @DataProvider(parallel = true, name = "defaultWebDataProvider")
    public static Object[][] defaultWebDataProvider() {
        return new Object[][]{
                new Object[]{"chrome", "70", "Windows 10"},
                new Object[]{"internet explorer", "11", "Windows 10"},
                new Object[]{"safari", "12.0", "Mac 10.13"},
                new Object[]{"chrome", "70", "Mac 10.13"},
                new Object[]{"firefox", "63", "Mac 10.13"}
        };
    }
}

aquí está mi clase de prueba

public class MSGWebExampleTest extends BaseTest {

    // Declare page objects
    private MSGHome msgHome;

    @Factory(dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER, dataProviderClass = DataProviderManager.class)
    //  @Factory(dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER)
    public MSGWebExampleTest(String browser, String browserVersion, String platform) {
        super.setRunParams(browser, browserVersion, platform);
    }

    @BeforeMethod(alwaysRun = true)
    public void setupTest() {
        msgHome = new MSGHome();
    }

    @TestCaseId("")
    @Features({GroupProps.WEB})
    @Test(groups = {GroupProps.DEBUG}, dataProvider = StaticProps.DEFAULT_WEB_DATA_PROVIDER)
    @Parameters({ParamProps.WEB, ParamProps.MOBILE_WEB})
      public void openSiteTest() {
        Logger.logMessage(Thread.currentThread().getId());
        new WebInteract(null, null).pause(1000).openUrl(URLBuilder.buildUrl());
    }
//    @DataProvider(parallel = true, name = StaticProps.DEFAULT_WEB_DATA_PROVIDER)
//    public static Object[][] defaultWebDataProvider() {
//        return new Object[][] {
//                new Object[]{"chrome", "70", "Windows 10"},
//                new Object[]{"internet explorer", "11", "Windows 10"},
//                new Object[]{"safari", "12.0", "Mac 10.13"},
//                new Object[]{"chrome", "70", "Mac 10.13"},
//                new Object[]{"firefox", "63", "Mac 10.13"}
//        };
//    }

}

Si desea probar el escenario uno, elimine el comentario de lo que está en la prueba. Para el escenario 2, puede ejecutar como está

@VinceBarresi : el problema en ambos casos se debe a su código de prueba. No creo que TestNG tenga la culpa aquí.

escenario 1

El error org.testng.internal.reflect.MethodMatcherException: Data provider mismatch aparece porque está vinculando el método de prueba public void openSiteTest() con un proveedor de datos que devuelve 3 parámetros defaultWebDataProvider() pero su método de prueba no tiene ningún argumento de método en todos. Debe asegurarse de que el método de prueba y el proveedor de datos con el que está vinculado coincidan en los parámetros en términos de longitud, tipo y orden de los parámetros. Corrija su código de prueba.

Escenario 2

El error Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider se debe nuevamente a un problema en su código de prueba. Movió su proveedor de datos a una clase diferente llamada DataProviderManager . Pero en su método @Test solo se refiere al proveedor de datos por su nombre. De forma predeterminada, si no proporciona el nombre de la clase en la que reside su proveedor de datos, TestNG siempre buscará un proveedor de datos en la clase actual. Dado que no se encuentra, TestNG se queja. Nuevamente, debe corregir su código de prueba para que pueda consultar a un proveedor de datos correctamente.

Dado que el problema original está resuelto, cierro este problema con una resolución como Pregunta respondida

@krmahadevan Este es un malentendido de DataProvider de mi parte - Dado que no necesito los parámetros pasados ​​de él en la prueba en sí (los necesito en mis captadores y

Tengo una pregunta más sobre el paralelismo si tiene un momento: ¿Cómo configuro el recuento de subprocesos del proveedor de datos y / o el recuento de subprocesos para que los 5 conjuntos de datos de

@DataProvider(parallel = true, name = "dp") public static Object[][] defaultWebDataProvider() { return new Object[][]{ new Object[]{"chrome", "70", "Windows 10"}, new Object[]{"internet explorer", "11", "Windows 10"}, new Object[]{"safari", "12.0", "Mac 10.13"}, new Object[]{"chrome", "70", "Mac 10.13"}, new Object[]{"firefox", "63", "Mac 10.13"} }; }
ejecutar exactamente al mismo tiempo para cada @test ? Actualmente puedo ejecutar en paralelo, pero está ejecutando el mismo conjunto (por ejemplo, "chrome", "70", "Windows 10") n número de veces de subprocesos en lugar de ejecutar cada conjunto al mismo tiempo.

Debe utilizar una fábrica (anotación @Factory ) con un proveedor de datos.

La fábrica utiliza el proveedor de datos para crear básicamente instancias de clases de prueba (una clase que alberga uno o más métodos @Test ), y luego, cuando se ejecutan, TestNG se aseguraría de que ejecutaría todos los métodos de prueba en una instancia. (use el atributo parallel=instances )

@krmahadevan Estoy usando @Factory, que configura capacidades que incluyen navegador, versión, plataforma desde mi DataProvider e inicializa instancias seguras para subprocesos de WebDriver. Si configuro (paralelo = instancias), la prueba se ejecuta en paralelo pero ejecuta varias instancias con el mismo navegador, versión y plataforma de mi DataProvider, como puede ver a continuación:

screen shot 2018-11-19 at 10 20 21 am

En lugar de ejecutar varios subprocesos, cada uno de ellos en Safari, 12, Mac 10.13, estoy tratando de ejecutar la prueba en varios subprocesos en paralelo con -

nuevo objeto [] {"chrome", "70", "Windows 10"}, ESTE DEBE SER HILO 1
nuevo objeto [] {"internet explorer", "11", "Windows 10"}, ESTE DEBE SER HILO 2
nuevo objeto [] {"safari", "12.0", "Mac 10.13"}, ESTE DEBE SER HILO 3
nuevo objeto [] {"chrome", "70", "Mac 10.13"}, ESTE DEBE SER HILO 4
nuevo objeto [] {"firefox", "63", "Mac 10.13"} ESTE DEBE SER HILO 5

@VinceBarresi : he agregado una respuesta detallada a su pregunta sobre el desbordamiento de pila.

Para resumir en pocas palabras, cuando usa @Factory con @DataProvider para producir instancias de clase de prueba, TestNG crea instancias de clase de prueba en paralelo, pero ejecuta cada uno de los @Test métodos en cada una de las clases de prueba en secuencia.

@krmahadevan, su respuesta en StackOverflow fue muy esclarecedora, ¡gracias!

Una pregunta: digamos que usa el mismo proveedor de datos para cada prueba. ¿Hay alguna forma de evitar la duplicación del código de fábrica en cada clase?

¡Gracias!

@borbamartin - Usted puede tener todos sus @Factory fábricas alimentadas comparten el mismo proveedor de datos utilizando el dataProviderClass atributo en el @Factory anotación.

su respuesta en StackOverflow fue muy esclarecedora, ¡gracias!

Me alegra saber que te ayudó 👍

@krmahadevan sí, déjame reformular.

Digamos que tengo 50 clases de entidades que contienen múltiples pruebas cada una. Esto significa que tengo que escribir las siguientes 50 veces (en cada clase)

@Factory(dataProvider = "browserMatrix")
public LoginFeature(BrowserConfig browserConfig) {
    super.browserConfig = browserConfig;
}

La pregunta es, ¿TestNG proporciona algo que pueda usar para evitar escribir esto en cada clase de prueba?

¡Gracias una vez más!

@borbamartin : hasta donde

¿Fue útil esta página
0 / 5 - 0 calificaciones