Testng: DataProvider führt keine Tests parallel aus, wenn Factory . verwendet wird

Erstellt am 13. Nov. 2018  ·  15Kommentare  ·  Quelle: cbeust/testng

TestNG-Version

7.0.0-beta1

Erwartetes Verhalten

Ich habe eine Klasse, die einen DataProvider mit 5 Datensätzen enthält, einschließlich Browsername, Version und Plattform, wie Sie hier sehen können:

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

In meiner Testklasse verwende ich Factory, um Daten als solche zu übergeben:

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

Wenn ich thread-count =2 und data-provider-thread-count =4 und parallel=true setze, sollte mein Test 8-mal parallel laufen.

Tatsächliches Verhalten

Tests werden sequentiell ausgeführt, unabhängig davon, wie viele Threads ich zu setzen versuche, als ob parallel=true ignoriert wird. Ich habe zahlreiche Versuche unternommen, um dies mit der obigen testing.xml parallel laufen zu lassen, indem ich -Dthreadcount=2 -Ddataproviderthreacount=4 von der Befehlszeile aus übergeben und sogar diese Werte im config-Tag für das Surefire-Plugin gesetzt habe und nichts funktioniert.

Ist das Problem auf dem Läufer reproduzierbar?

  • [x] Muschel
  • [x] Maven
  • [ ] Gradle
  • [ ] Ameise
  • [ ] Sonnenfinsternis
  • [x] IntelliJ
  • [ ] NetBeans

Testfallbeispiel

Bitte teilen Sie den Testfall (so klein wie möglich), der das Problem zeigt

Question

Alle 15 Kommentare

@VinceBarresi - Ich bin mir nicht ganz sicher, wie Sie sagen, dass TestNG Tests nacheinander

Ich habe Ihre Testklasse geändert, um die Thread-IDs auszudrucken, und so sieht es aus

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>

Die Ausgabe

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

Wie Sie aus der obigen Ausgabe sehen können, sind die Thread-IDs unterschiedlich (zwei Threads, um genau zu sein, da unsere Thread-Anzahl 2 ist).

Ihr Datenprovider in Ihrem Beispiel ist an eine Factory-Methode und NICHT an eine @Test Methode gebunden. Es spielt also keine Rolle, wie viele Threads ausgeführt werden.

Nur wenn folgendes passiert -

  • ein Datenprovider ist mit einer @Test Methode gekoppelt
  • das parallele Attribut von @DataProvider wird auf true
  • das Attribut parallel wird auf methods in dem <suite> (oder) <test> tag
  • data-provider-thread-count Wert wird mit einem Wert höher als 1 gesetzt

Parallelität wird von TestNG aktiviert und die Anzahl der @Test Methoden, die vom Datenprovider bereitgestellt werden, entspricht der Anzahl der Threads, die über das Attribut data-provider-thread-count.

Hinweis: Das thread-count Attribut in der Suite-XML-Datei gilt NUR für REGULAR-Methoden und das data-provider-thread-count Attribut in der Suite-XML-Datei gilt NUR für eine vom Datenanbieter betriebene Testmethode

Bitte lassen Sie mich wissen, ob diese Erklärung sinnvoll ist und ob dieses Problem geschlossen werden kann.

@krmahadevan Vielen Dank für Ihre ausführliche Antwort. Ich würde gerne selbst laufen, um dies bei Gelegenheit zu testen. Ich habe ein paar Fragen,

1: Muss der Datenprovider (in diesem Fall - "dp) in der gleichen Klasse sein wie der @Test, an den wir den Datenprovider übergeben, um noch Parallelität durch data-provider-thread-count und parallel = true zu erreichen

2: Haben Sie Tests auf Suite-Ebene durchgeführt? Wenn ja, spielt dies in Bezug auf Parallelität überhaupt eine Rolle? Wenn ich beispielsweise meine Tests der Gruppe DEBUG per Surefire mit mvn test -Dgroups=DEBUG abbreche, muss ich dann die Threadanzahl des Datenproviders über einen Parameter in diesem Befehl übergeben?

1: Muss der Datenprovider (in diesem Fall - "dp) in der gleichen Klasse sein wie das @Test wir den Datenprovider übergeben, um noch Parallelität durch die Datenprovider-Thread-Anzahl zu erreichen und parallel = wahr?

Nicht nötig. Dabei spielt es keine Rolle, wo der Datenanbieter ansässig ist.

2: Haben Sie Tests auf Suite-Ebene durchgeführt? Wenn ja, spielt dies in Bezug auf Parallelität überhaupt eine Rolle? Wenn ich beispielsweise meine Tests der Gruppe DEBUG per Surefire mit mvn test -Dgroups=DEBUG abbreche, muss ich dann die Threadanzahl des Datenproviders über einen Parameter in diesem Befehl übergeben?

Ja, ich habe die Tests auf Suite-Ebene durchgeführt. Es sollte keine Rolle spielen. Wie
solange die Threadanzahl des Datenproviders in der Suite-Datei verfügbar ist
(Standardwert, wenn nicht angegeben, ist 10, glaube ich), es sollte funktionieren
einwandfrei.

@krmahadevan Also hatte ich heute Morgen die Gelegenheit, Ihre vorgeschlagenen Änderungen zu testen und ein paar Beobachtungen zu machen.

  1. Wenn ich den DataProvider in der Testklasse behalte und den DataProvider-Namen an die Testannotation übergebe, scheint der Test parallel zu laufen, aber ich sehe die folgenden Fehler:
...
... 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. Wenn ich den DataProvider zurück in meine DataProviderManager.java-Klasse verschiebe und versuche, mit dem an die Testannotation übergebenen DataProvider zu laufen, scheint es erneut zu versuchen, parallel zu laufen, aber ich sehe den folgenden Fehler, der ein anderer Fehler ist:
...
... 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
===============================================

Irgendwelche Gedanken dazu?

Können Sie bitte den Testcode teilen, den Sie verwendet haben, um den Fehler auszulösen?

Ich verwende die genaue Datei testing.xml, die Sie oben eingefügt haben (offensichtlich mit der Klasse, die auf meine Testklasse in meinem Paket verweist). Hier ist mein 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"}
        };
    }
}

hier ist meine testklasse

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

}

Wenn Sie Szenario 1 testen möchten, entkommentieren Sie, was im Test enthalten ist. Für Szenario 2 können Sie es so ausführen, wie es ist

@VinceBarresi - Das Problem liegt in beiden Fällen an Ihrem

Szenario 1

Der Fehler org.testng.internal.reflect.MethodMatcherException: Data provider mismatch auf, weil Sie die Testmethode public void openSiteTest() mit einem Datenprovider verknüpfen, der 3 Parameter defaultWebDataProvider() zurückgibt, aber Ihre Testmethode hat keine Methodenargumente bei alle. Sie müssen sicherstellen, dass die Testmethode und der Datenprovider, mit dem sie verbunden ist, in den Parametern in Bezug auf Länge, Art und Reihenfolge der Parameter übereinstimmen. Bitte korrigieren Sie Ihren Testcode.

Szenario 2

Der Fehler Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider ist wiederum auf ein Problem in Ihrem Testcode zurückzuführen. Sie haben Ihren Datenprovider in eine andere Klasse namens DataProviderManager verschoben. Aber in Ihrer Methode @Test beziehen Sie sich nur namentlich auf den Datenanbieter. Wenn Sie nicht den Klassennamen angeben, in dem sich Ihr Datenprovider befindet, sucht TestNG standardmäßig immer nach einem Datenprovider in der aktuellen Klasse. Da es nicht gefunden wird, beschwert sich TestNG. Auch hier müssen Sie Ihren Testcode korrigieren, damit Sie richtig auf einen Datenanbieter verweisen können.

Da das ursprüngliche Problem gelöst ist, schließe ich dieses Problem mit einer Lösung als Frage beantwortet

@krmahadevan Dies ist ein Missverständnis von DataProvider meinerseits - Da ich die von ihm übergebenen Parameter im Test selbst nicht benötige (ich brauche sie in meinen threadlokalen Gettern und Settern, um an Selen-Fähigkeiten zu übergeben), wusste ich nicht, dass ich es brauchte um sie an die eigentliche Testmethode zu übergeben. Ich weiß es sehr zu schätzen, dass du das aufklärst!

Ich habe noch eine Frage zur Parallelität, wenn Sie einen Moment Zeit haben - Wie stelle ich die Thread-Anzahl und / oder die Thread-Anzahl des Datenproviders ein, damit alle 5 Datensätze von

@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"} }; }
für jeden @test genau zur gleichen Zeit

Sie müssen eine Factory (Anmerkung @Factory ) mit einem Datenanbieter verwenden.

Die Factory verwendet den Datenprovider, um im Wesentlichen Testklasseninstanzen zu erstellen (eine Klasse, die eine oder mehrere @Test Methoden enthält), und wenn sie ausgeführt werden, würde TestNG sicherstellen, dass alle Testmethoden in einer Instanz ausgeführt werden (verwenden Sie das Attribut parallel=instances )

@krmahadevan Ich verwende @Factory, das Funktionen wie Browser, Version, Plattform von meinem DataProvider einrichtet und Thread-sichere Instanzen von WebDriver initialisiert. Wenn ich (parallel=instances) setze, läuft der Test parallel, führt jedoch mehrere Instanzen mit demselben Browser, derselben Version und derselben Plattform von meinem DataProvider aus, wie Sie unten sehen können:

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

Anstatt mehrere Threads jeweils auf Safari, 12, Mac 10.13 auszuführen, versuche ich, den Test mit mehreren Threads parallel auszuführen mit -

neues Objekt[]{"chrome", "70", "Windows 10"}, DIES SOLLTE THREAD 1 SEIN
neues Objekt[]{"Internet Explorer", "11", "Windows 10"}, DIES SOLLTE THREAD 2 SEIN
neues Objekt[]{"safari", "12.0", "Mac 10.13"}, DIES SOLLTE THREAD 3 SEIN
neues Objekt[]{"chrome", "70", "Mac 10.13"}, DIES SOLLTE THREAD 4 SEIN
new Object[]{"firefox", "63", "Mac 10.13"} DIES SOLLTE THREAD 5 . SEIN

@VinceBarresi - Ich habe Ihre Frage zum Stapelüberlauf ausführlich beantwortet.

Um es kurz zusammenzufassen: Wenn Sie ein @Factory mit einem @DataProvider , um Testklasseninstanzen zu erzeugen, instanziiert TestNG die Testklasseninstanzen parallel, führt aber jede der @Test Methoden in jeder der Testklassen nacheinander.

@krmahadevan deine Antwort auf StackOverflow war sehr aufschlussreich, danke!

Eine Frage: Angenommen, Sie verwenden für jeden Test denselben Datenprovider. Gibt es eine Möglichkeit, das Duplizieren des Werkscodes in jeder Klasse zu vermeiden?

Vielen Dank!

@borbamartin - Sie können alle Ihre mit @Factory betriebenen Fabriken denselben Datenprovider verwenden lassen, indem Sie das Attribut dataProviderClass in der Anmerkung @Factory .

deine Antwort auf StackOverflow war sehr aufschlussreich, danke!

Freut mich zu wissen, dass es dir geholfen hat 👍

@ krmahadevan ja, lass mich umformulieren.

Angenommen, ich habe 50 Feature-Classes, die jeweils mehrere Tests enthalten. Das bedeutet, dass ich die folgenden 50 Mal schreiben muss (in jeder Klasse)

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

Die Frage ist, bietet TestNG etwas, mit dem ich vermeiden kann, dies in jeder Testklasse zu schreiben?

Noch einmal vielen Dank!

@borbamartin - Nach meinem besten Wissen gibt es in TestNG nichts, was dies automatisch für Sie

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen