Testng: DataProvider tidak menjalankan tes Secara Paralel saat menggunakan Pabrik

Dibuat pada 13 Nov 2018  ·  15Komentar  ·  Sumber: cbeust/testng

Versi TestNG

7.0.0-beta1

Perilaku yang diharapkan

Saya memiliki kelas yang berisi DataProvider dengan 5 kumpulan data termasuk nama browser, versi, dan platform seperti yang Anda lihat di sini:

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

Di kelas pengujian saya, saya menggunakan Pabrik untuk mengirimkan data seperti:

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

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

Jika saya menetapkan jumlah utas =2 dan penyedia data-jumlah utas =4 dan paralel=true, pengujian saya harus berjalan 8 kali secara paralel.

Perilaku sebenarnya

Tes berjalan secara berurutan terlepas dari berapa banyak utas yang saya coba atur seolah-olah parallel=true diabaikan. Saya mencoba berbagai upaya untuk menjalankan ini secara paralel menggunakan testing.xml di atas, dengan meneruskan -Dthreadcount=2 -Ddataproviderthreacount=4 dari commandline dan bahkan menyetel nilai-nilai ini di tag konfigurasi untuk plugin surefire dan tidak ada yang berfungsi.

Apakah masalah dapat direproduksi pada runner?

  • [x] Kulit
  • [x] Maven
  • [ ] Gradle
  • [ ] Semut
  • [ ] Gerhana
  • [x] IntelliJ
  • [ ] NetBeans

Contoh kasus uji

Tolong, bagikan test case (sekecil mungkin) yang menunjukkan masalahnya

Question

Semua 15 komentar

@VinceBarresi - Saya tidak yakin bagaimana Anda mengatakan bahwa TestNG menjalankan tes secara berurutan.

Saya mengubah kelas pengujian Anda untuk mencetak id utas dan inilah tampilannya

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>

Hasil

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

Seperti yang Anda lihat dari output di atas, id utas berbeda (dua utas lebih spesifik karena jumlah utas kami adalah 2)

Penyedia data Anda dalam sampel Anda terkait dengan metode pabrik dan BUKAN dengan metode @Test . Jadi itu tidak akan memiliki peran apa pun untuk dimainkan dengan jumlah utas yang dieksekusi.

Hanya ketika hal berikut terjadi -

  • penyedia data digabungkan dengan metode @Test
  • atribut paralel @DataProvider diatur ke true
  • atribut parallel disetel ke methods dalam tag <suite> (atau) <test>
  • data-provider-thread-count diatur dengan nilai lebih tinggi dari 1

Paralelisme akan diaktifkan oleh TestNG dan jumlah metode @Test yang didukung oleh penyedia data akan sama dengan jumlah utas yang ditetapkan melalui atribut data-provider-thread-count.

Catatan: Atribut thread-count dalam file xml suite HANYA berlaku data-provider-thread-count dalam file xml suite HANYA berlaku

Tolong beri tahu saya jika penjelasan itu masuk akal dan jika masalah ini dapat ditutup.

@krmahadevan Terima kasih atas tanggapan terperinci Anda. Saya ingin menjalankan sendiri untuk menguji ini ketika saya mendapat kesempatan. Saya punya beberapa pertanyaan,

1: Apakah penyedia data (dalam hal ini - "dp) harus berada di kelas yang sama dengan @Test yang kami

2: Apakah Anda menjalankan tes di tingkat suite? Jika demikian, apakah ini penting dalam hal paralelisme? Misalnya, jika saya memulai pengujian grup DEBUG saya melalui surefire menggunakan mvn test -Dgroups=DEBUG, apakah saya perlu meneruskan threadcount penyedia data melalui parameter dalam perintah ini?

1: Apakah penyedia data (dalam hal ini - "dp) harus berada di kelas yang sama dengan @Test kami berikan kepada penyedia data agar tetap mencapai paralelisme oleh penyedia data-thread-count dan paralel = benar?

Tidak perlu. Tidak masalah di mana penyedia data berada.

2: Apakah Anda menjalankan tes di tingkat suite? Jika demikian, apakah ini penting dalam hal paralelisme? Misalnya, jika saya memulai pengujian grup DEBUG saya melalui surefire menggunakan mvn test -Dgroups=DEBUG, apakah saya perlu meneruskan threadcount penyedia data melalui parameter dalam perintah ini?

Ya, saya memang menjalankan tes di tingkat suite. Seharusnya tidak masalah. Sebagai
selama jumlah utas penyedia data tersedia di file suite
(nilai default jika tidak disediakan adalah 10, saya percaya), itu akan berfungsi
mulus.

@krmahadevan Jadi saya memiliki kesempatan untuk menguji pagi ini menggunakan perubahan yang Anda sarankan dan melakukan beberapa pengamatan.

  1. Jika saya menyimpan DataProvider di kelas pengujian dan meneruskan nama DataProvider ke anotasi pengujian, tampaknya pengujian mencoba berjalan secara paralel tetapi saya melihat kesalahan berikut:
...
... 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. Jika saya memindahkan DataProvider kembali ke kelas DataProviderManager.java saya dan mencoba menjalankan dengan DataProvider yang diteruskan ke anotasi pengujian, tampaknya sekali lagi mencoba berjalan secara paralel tetapi saya melihat kesalahan berikut yang berbeda:
...
... 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
===============================================

Setiap pemikiran tentang ini?

Bisakah Anda membagikan kode pengujian yang Anda gunakan untuk memicu kesalahan?

Saya menggunakan file testing.xml persis yang Anda tempel di atas (jelas dengan kelas yang menunjuk ke kelas pengujian saya di paket saya). Ini DataProviderManager.java saya

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

ini kelas ujianku

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

}

Jika Anda ingin menguji skenario satu maka batalkan komentar apa yang ada dalam pengujian. Untuk skenario 2 Anda dapat menjalankan apa adanya

@VinceBarresi - Masalah dalam kedua kasus ini disebabkan oleh kode pengujian Anda. Saya tidak berpikir TestNG salah di sini.

skenario 1

Kesalahan org.testng.internal.reflect.MethodMatcherException: Data provider mismatch muncul karena Anda mengikat metode pengujian public void openSiteTest() dengan penyedia data yang mengembalikan 3 parameter defaultWebDataProvider() tetapi metode pengujian Anda tidak memiliki argumen metode apa pun di semua. Anda perlu memastikan bahwa metode pengujian dan penyedia data yang terkait dengannya, cocok dengan parameter dalam hal panjang, jenis, dan urutan parameter. Harap perbaiki kode pengujian Anda.

Skenario 2

Kesalahan Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider sekali lagi disebabkan oleh masalah dalam kode pengujian Anda. Anda memindahkan penyedia data Anda ke kelas lain bernama DataProviderManager . Tetapi dalam metode @Test Anda, Anda hanya merujuk ke penyedia data berdasarkan nama. Secara default jika Anda tidak memberikan nama kelas tempat penyedia data Anda berada, TestNG akan selalu mencari penyedia data di kelas saat ini. Karena tidak ditemukan keluhan TestNG. Sekali lagi Anda perlu memperbaiki kode pengujian Anda sehingga Anda merujuk ke penyedia data dengan benar.

Karena masalah aslinya sudah teratasi, saya menutup masalah ini dengan resolusi saat Pertanyaan dijawab

@krmahadevan Ini adalah kesalahpahaman dari DataProvider di pihak saya - Karena saya tidak memerlukan parameter yang lulus darinya dalam pengujian itu sendiri (saya membutuhkannya di pengambil dan penyetel threadlocal saya untuk diteruskan ke kemampuan Selenium) saya tidak menyadari bahwa saya membutuhkannya untuk meneruskannya ke metode pengujian yang sebenarnya. Saya sangat menghargai Anda membersihkan ini!

Saya punya satu pertanyaan lagi tentang paralelisme jika Anda punya waktu - Bagaimana cara mengatur jumlah utas penyedia data dan/atau jumlah utas sehingga semua 5 kumpulan data dari

@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"} }; }
dijalankan pada waktu yang sama untuk setiap @test ? Saat ini saya dapat menjalankan secara paralel tetapi menjalankan set yang sama (misalnya "chrome", "70", "Windows 10") n jumlah waktu utas alih-alih menjalankan setiap set pada waktu yang sama.

Anda harus menggunakan pabrik ( @Factory penjelasan) dengan penyedia data.

Pabrik menggunakan penyedia data untuk pada dasarnya membuat instance kelas pengujian (kelas yang menampung satu atau lebih metode @Test ), dan kemudian ketika dijalankan, TestNG akan memastikan bahwa ia akan menjalankan semua metode pengujian dalam sebuah instance (gunakan atribut parallel=instances )

@krmahadevan Saya menggunakan @Factory yang mengatur kemampuan termasuk browser, versi, platform dari DataProvider saya dan menginisialisasi contoh thread safe WebDriver. Jika saya menetapkan (parallel=instances) pengujian berjalan secara paralel tetapi menjalankan beberapa instance dengan browser, versi, platform yang sama dari DataProvider saya seperti yang Anda lihat di bawah:

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

Alih-alih menjalankan banyak utas masing-masing di Safari, 12, Mac 10.13, saya mencoba menjalankan tes dengan beberapa utas secara paralel dengan -

objek baru[]{"chrome", "70", "Windows 10"}, INI HARUS THREAD 1
objek baru[]{"internet explorer", "11", "Windows 10"}, INI HARUS THREAD 2
objek baru[]{"safari", "12.0", "Mac 10.13"}, INI HARUS THREAD 3
objek baru[]{"chrome", "70", "Mac 10.13"}, INI HARUS THREAD 4
objek baru[]{"firefox", "63", "Mac 10.13"} INI HARUS THREAD 5

@VinceBarresi - Saya telah menambahkan jawaban terperinci untuk pertanyaan Anda tentang stack overflow.

Singkatnya, ketika Anda menggunakan @Factory dengan @DataProvider untuk menghasilkan instance kelas pengujian, TestNG membuat instance kelas pengujian secara paralel, tetapi menjalankan masing-masing @Test metode di setiap kelas uji secara berurutan.

@krmahadevan balasan Anda di StackOverflow sangat mencerahkan, terima kasih!

Satu pertanyaan: Katakanlah Anda menggunakan penyedia data yang sama untuk setiap pengujian. Apakah ada cara agar kita dapat menghindari duplikasi kode pabrik di setiap kelas?

Terima kasih!

@borbamartin - Anda dapat memiliki semua Anda @Factory pabrik bertenaga berbagi penyedia data yang sama dengan menggunakan dataProviderClass atribut dalam @Factory penjelasan.

balasan Anda di StackOverflow sangat mencerahkan, terima kasih!

Senang mengetahui itu membantu Anda 👍

@krmahadevan ya, izinkan saya ulangi.

Katakanlah saya memiliki 50 kelas fitur yang masing-masing berisi beberapa tes. Ini berarti saya harus menulis 50 kali berikut (di setiap kelas)

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

Pertanyaannya adalah, apakah TestNG menyediakan sesuatu yang dapat saya gunakan untuk menghindari penulisan ini di setiap kelas tes?

Sekali lagi terima kasih!

@borbamartin - Sepengetahuan saya, tidak ada di TestNG yang secara otomatis melakukan ini untuk Anda. Anda harus melakukannya sendiri.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat