Testng: DataProvider n'exécute pas de tests en parallèle lors de l'utilisation de Factory

Créé le 13 nov. 2018  ·  15Commentaires  ·  Source: cbeust/testng

Tester la version NG

7.0.0-beta1

Comportement prévisible

J'ai une classe qui contient un DataProvider avec 5 ensembles de données, y compris le nom, la version et la plate-forme du navigateur, comme vous pouvez le voir ici :

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"}
        };
    }
}

Dans ma classe de test, j'utilise Factory pour transmettre des données en tant que telles :

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());
    }
}

test.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 je définis thread-count =2 et data-provider-thread-count =4 et parallel=true, mon test devrait s'exécuter 8 fois en parallèle.

Comportement réel

Les tests s'exécutent séquentiellement, quel que soit le nombre de threads que j'essaie de définir, comme si parallel=true était ignoré. J'ai essayé de nombreuses tentatives pour que cela s'exécute en parallèle à l'aide du testing.xml ci-dessus, en passant -Dthreadcount=2 -Ddataproviderthreacount=4 à partir de la ligne de commande et même en définissant ces valeurs dans la balise config pour le plugin surefire et rien ne fonctionne.

Le problème est-il reproductible sur le coureur ?

  • [x] Coquille
  • [x] Maven
  • [ ] Gradle
  • [ ] Fourmi
  • [ ] Éclipse
  • [x] IntelliJ
  • [ ] NetBeans

Exemple de cas de test

S'il vous plaît, partagez le cas de test (aussi petit que possible) qui montre le problème

Question

Tous les 15 commentaires

@VinceBarresi - Je ne sais pas trop comment vous dites que TestNG exécute des tests de manière séquentielle.

J'ai modifié votre classe de test pour imprimer les identifiants de thread et voici à quoi cela ressemble

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>

Le résultat

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

Comme vous pouvez le voir sur la sortie ci-dessus, les identifiants de thread sont différents (deux threads pour être précis puisque notre nombre de threads est de 2)

Votre fournisseur de données dans votre échantillon est lié à une méthode d'usine et NON à une méthode @Test . Il n'aura donc aucun rôle à jouer dans le nombre de threads en cours d'exécution.

Seulement lorsque ce qui suit se produit -

  • un fournisseur de données est couplé à une méthode @Test
  • l'attribut parallèle de @DataProvider est défini sur true
  • l'attribut parallel est défini sur methods dans la balise <suite> (ou) <test>
  • data-provider-thread-count est définie avec une valeur supérieure à 1

Le parallélisme sera activé par TestNG et le nombre de méthodes @Test alimentées par le fournisseur de données serait égal au nombre de threads définis via l'attribut data-provider-thread-count.

Remarque : L' attribut thread-count dans le fichier XML de la suite s'applique UNIQUEMENT aux méthodes RÉGULIÈRES et l'attribut data-provider-thread-count dans le fichier XML de la suite s'applique UNIQUEMENT à une méthode de test alimentée par un fournisseur de données

S'il vous plaît laissez-moi savoir si cette explication a du sens et si ce problème peut être clos.

@krmahadevan Merci pour votre réponse détaillée. J'aimerais me lancer pour tester ça quand j'en ai l'occasion. J'ai quelques questions,

1 : le fournisseur de données (dans ce cas - "dp) doit-il être dans la même classe que le @Test auquel nous

2 : Avez-vous exécuté des tests au niveau de la suite ? Si oui, est-ce même important en termes de parallélisme ? Par exemple, si je lance mes tests du groupe DEBUG via surefire en utilisant mvn test -Dgroups=DEBUG, dois-je passer le nombre de threads du fournisseur de données via un paramètre dans cette commande ?

1 : Le fournisseur de données (dans ce cas - "dp) doit-il être dans la même classe que le @Test nous passons le fournisseur de données afin d'obtenir toujours le parallélisme par data-provider-thread-count et parallèle = vrai ?

Pas nécessaire. Peu importe où réside le fournisseur de données.

2 : Avez-vous exécuté des tests au niveau de la suite ? Si oui, est-ce même important en termes de parallélisme ? Par exemple, si je lance mes tests du groupe DEBUG via surefire en utilisant mvn test -Dgroups=DEBUG, dois-je passer le nombre de threads du fournisseur de données via un paramètre dans cette commande ?

Oui, j'ai exécuté les tests au niveau de la suite. Cela ne devrait pas avoir d'importance. Comme
tant que le nombre de threads du fournisseur de données est disponible dans le fichier de la suite
(la valeur par défaut si ce n'est pas fourni est 10 je crois), ça devrait fonctionner
en toute transparence.

@krmahadevan J'ai donc eu la chance de tester ce matin en utilisant vos modifications suggérées et d'avoir quelques observations.

  1. Si je garde le DataProvider dans la classe de test et que je transmets le nom du DataProvider à l'annotation de test, il semble que le test essaie de s'exécuter en parallèle mais je vois les erreurs suivantes :
...
... 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 je déplace le DataProvider vers ma classe DataProviderManager.java et que j'essaie de l'exécuter avec le DataProvider transmis à l'annotation de test, il semble à nouveau essayer de s'exécuter en parallèle, mais je vois ce qui suit qui est une erreur différente :
...
... 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
===============================================

Des idées à ce sujet ?

Pouvez-vous s'il vous plaît partager le code de test que vous avez utilisé pour déclencher l'erreur ?

J'utilise le fichier testing.xml exact que vous avez collé ci-dessus (évidemment avec la classe pointant vers ma classe de test dans mon package). Voici mon 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"}
        };
    }
}

voici mon cours d'essai

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 vous souhaitez tester le premier scénario, décommentez le contenu du test. Pour le scénario 2, vous pouvez exécuter tel quel

@VinceBarresi - Le problème dans les deux cas est dû à votre code de test. Je ne pense pas que TestNG soit en faute ici.

Scénario 1

L'erreur org.testng.internal.reflect.MethodMatcherException: Data provider mismatch arrive car vous liez la méthode de test public void openSiteTest() avec un fournisseur de données qui renvoie 3 paramètres defaultWebDataProvider() mais votre méthode de test n'a aucun argument de méthode à tous. Vous devez vous assurer que la méthode de test et le fournisseur de données auquel elle est liée correspondent dans les paramètres en termes de longueur, de type et d'ordre des paramètres. Veuillez corriger votre code de test.

Scénario 2

L'erreur Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider est à nouveau due à un problème dans votre code de test. Vous avez déplacé votre fournisseur de données vers une autre classe nommée DataProviderManager . Mais dans votre méthode @Test , vous ne faites référence au fournisseur de données que par son nom. Par défaut, si vous ne fournissez pas le nom de la classe dans laquelle réside votre fournisseur de données, TestNG recherchera toujours un fournisseur de données dans la classe actuelle. Depuis son introuvable TestNG se plaint. Encore une fois, vous devez corriger votre code de test afin de vous référer correctement à un fournisseur de données.

Étant donné que le problème d'origine est résolu, je ferme ce problème avec une résolution en tant que réponse à la question

@krmahadevan Il s'agit d'une incompréhension de DataProvider de ma part - Étant donné que je n'ai pas besoin des paramètres transmis dans le test lui-même ( j'en ai besoin dans mes getters et setters threadlocal pour passer aux capacités de sélénium ) je ne savais pas que j'avais besoin pour les passer à la méthode d'essai réelle. J'apprécie vraiment que vous ayez éclairci cela !

J'ai une autre question sur le parallélisme si vous avez un moment - Comment définir le nombre de threads du fournisseur de données et/ou le nombre de threads de sorte que les 5 ensembles de données 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"} }; }
exécuté exactement à la même heure pour chaque @test ? Actuellement, je peux exécuter en parallèle, mais il exécute le même ensemble (par exemple, "chrome", "70", "Windows 10") n nombre de threads au lieu d'exécuter chaque ensemble en même temps.

Vous devez utiliser une usine (annotation @Factory ) avec un fournisseur de données.

L'usine utilise le fournisseur de données pour créer essentiellement des instances de classe de test (une classe qui héberge une ou plusieurs méthodes @Test ), puis lorsqu'elles sont exécutées, TestNG s'assurera qu'il exécutera toutes les méthodes de test dans une instance (utilisez l'attribut parallel=instances )

@krmahadevan J'utilise @Factory qui configure des fonctionnalités telles que le navigateur, la version, la plate-forme de mon DataProvider et initialise les instances thread-safe de WebDriver. Si je définis (parallel=instances), le test s'exécute en parallèle mais exécute plusieurs instances avec le même navigateur, la même version et la même plate-forme à partir de mon DataProvider, comme vous pouvez le voir ci-dessous :

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

Au lieu d'exécuter plusieurs threads chacun sur Safari, 12, Mac 10.13, j'essaie d'exécuter le test sur plusieurs threads en parallèle avec -

new Object[]{"chrome", "70", "Windows 10"}, CECI DEVRAIT ÊTRE FIL 1
new Object[]{"internet explorer", "11", "Windows 10"}, CECI DEVRAIT ÊTRE FIL 2
nouvel objet[]{"safari", "12.0", "Mac 10.13"}, CECI DEVRAIT ÊTRE FIL 3
new Object[]{"chrome", "70", "Mac 10.13"}, CECI DEVRAIT ÊTRE FIL 4
new Object[]{"firefox", "63", "Mac 10.13"} CELA DEVRAIT ÊTRE FIL 5

@VinceBarresi - J'ai ajouté une réponse détaillée à votre question sur le débordement de pile.

Pour résumer en un mot, lorsque vous utilisez un @Factory avec un @DataProvider pour produire des instances de classe de test, TestNG instancie des instances de classe de test en parallèle, mais exécute chacune des @Test méthodes dans chacune des classes de test dans l'ordre.

@krmahadevan votre réponse sur StackOverflow était très instructive, merci !

Une question : disons que vous utilisez le même fournisseur de données pour chaque test. Existe-t-il un moyen d'éviter de dupliquer le code d'usine dans chaque classe ?

Merci!

@borbamartin - Vous pouvez avoir tous vos @Factory usines alimentées partagent le même fournisseur de données en utilisant le dataProviderClass attribut dans le @Factory annotation.

votre réponse sur StackOverflow a été très instructive, merci !

Content de savoir que ça t'a aidé

@krmahadevan oui, laissez-moi reformuler.

Disons que j'ai 50 classes d'entités qui contiennent chacune plusieurs tests. Cela signifie que je dois écrire les 50 fois suivantes (dans chaque classe)

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

La question est, est-ce que TestNG fournit quelque chose que je peux utiliser pour éviter d'écrire cela dans chaque classe de test ?

Encore merci!

@borbamartin - À ma connaissance, rien dans TestNG ne le fera automatiquement pour vous. Vous auriez besoin de le faire vous-même.

Cette page vous a été utile?
0 / 5 - 0 notes