Testng: لا يقوم DataProvider بتشغيل الاختبارات بالتوازي عند استخدام Factory

تم إنشاؤها على ١٣ نوفمبر ٢٠١٨  ·  15تعليقات  ·  مصدر: cbeust/testng

نسخة TestNG

7.0.0 بيتا 1

سلوك متوقع

لدي فصل يحتوي على DataProvider مع 5 مجموعات بيانات بما في ذلك اسم المتصفح والإصدار والنظام الأساسي كما ترى هنا:

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

في صفي الاختبار ، أستخدم Factory لتمرير البيانات على النحو التالي:

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

إذا قمت بتعيين عدد مؤشرات الترابط = 2 وبيانات-مزود-عدد مؤشرات الترابط = 4 ومتوازي = صحيح ، يجب أن يعمل الاختبار 8 مرات على التوازي.

السلوك الفعلي

يتم إجراء الاختبارات بالتتابع بغض النظر عن عدد الخيوط التي أحاول تعيينها كما لو تم تجاهل متوازي = صحيح. لقد حاولت عدة محاولات لتشغيل هذا بالتوازي باستخدام test.xml أعلاه ، من خلال تمرير -Dthreadcount = 2 -Ddataproviderthreacount = 4 من سطر الأوامر وحتى تعيين هذه القيم في علامة التكوين للمكوِّن الإضافي المؤكد ولا يعمل شيء.

هل المشكلة قابلة للظهور على العداء؟

  • [x] شل
  • [x] مخضرم
  • [] جرادل
  • [] النملة
  • [ ] كسوف
  • [x] IntelliJ
  • [] NetBeans

عينة حالة الاختبار

من فضلك ، شارك حالة الاختبار (صغيرة قدر الإمكان) التي توضح المشكلة

Question

ال 15 كومينتر

VinceBarresi - لست متأكدًا تمامًا من الطريقة التي تقول بها أن TestNG تجري الاختبارات بالتتابع.

لقد غيرت فئة الاختبار الخاصة بك لطباعة معرفات الخيط وإليك كيف يبدو

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>

الإخراج

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

كما ترى من الإخراج أعلاه ، تختلف معرفات سلسلة الرسائل (يجب أن يكون هناك موضوعان محددان لأن عدد مؤشرات الترابط لدينا هو 2)

موفر البيانات في عينتك مرتبط بطريقة المصنع وليس بطريقة @Test . لذلك لن يكون لها أي دور تلعبه في عدد المواضيع التي يتم تنفيذها.

فقط عندما يحدث ما يلي -

  • يقترن موفر البيانات بطريقة @Test
  • تم تعيين السمة الموازية لـ @DataProvider على true
  • تم تعيين السمة parallel على methods في علامة <suite> (أو) <test>
  • تم تعيين قيمة data-provider-thread-count بقيمة أعلى من 1

سيتم تمكين التوازي بواسطة TestNG وسيكون عدد الطرق @Test التي يدعمها موفر البيانات مساويًا لعدد سلاسل الرسائل التي تم تعيينها عبر السمة data-provider-thread-count.

ملاحظة: السمة thread-count في ملف xml الخاص بالمجموعة قابلة للتطبيق فقط على الطرق العادية و data-provider-thread-count السمة في ملف xml الخاص بالجناح قابلة للتطبيق فقط على طريقة الاختبار التي يدعمها موفر البيانات

يرجى إعلامي إذا كان هذا التفسير منطقيًا وإذا كان من الممكن إغلاق هذه المشكلة.

krmahadevan شكرًا لك على ردك التفصيلي. أود أن أجري نفسي لاختبار ذلك عندما تسنح لي الفرصة. لدي زوجين من الاسئلة،

1: هل يجب أن يكون موفر البيانات (في هذه الحالة - "dp) في نفس فئة الاختبار الذي نقوم بتمرير مزود البيانات إليه من أجل الاستمرار في تحقيق التوازي من خلال عدد البيانات-مزود-مؤشر الترابط والتوازي = صحيح ؟

2: هل أجريت اختبارات على مستوى المجموعة؟ إذا كان الأمر كذلك ، فهل هذا مهم من حيث التوازي؟ على سبيل المثال ، إذا أطلقت اختباراتي للمجموعة DEBUG عبر surefire باستخدام mvn test -Dgroups = DEBUG ، فهل أحتاج إلى تمرير مؤشر ترابط مجموعة البيانات عبر معلمة في هذا الأمر؟

1: هل يجب أن يكون موفر البيانات (في هذه الحالة - "dp) في نفس الفئة مثل @Test الذي نقوم بتمرير مزود البيانات إليه من أجل الاستمرار في تحقيق التوازي من خلال عدد مؤشرات ترابط مزود البيانات والتوازي = صحيح؟

ليس من الضروري. لا يهم أين يتواجد مزود البيانات.

2: هل أجريت اختبارات على مستوى المجموعة؟ إذا كان الأمر كذلك ، فهل هذا مهم من حيث التوازي؟ على سبيل المثال ، إذا أطلقت اختباراتي للمجموعة DEBUG عبر surefire باستخدام mvn test -Dgroups = DEBUG ، فهل أحتاج إلى تمرير مؤشر ترابط مجموعة البيانات عبر معلمة في هذا الأمر؟

نعم لقد أجريت الاختبارات على مستوى الجناح. لا ينبغي أن يهم. كما
طالما أن عدد خيوط مزود البيانات متاح في ملف المجموعة
(القيمة الافتراضية إذا لم يتم توفيرها هي 10 على ما أعتقد) ، يجب أن تعمل
بسلاسة.

krmahadevan لذا أتيحت لي الفرصة للاختبار هذا الصباح باستخدام التغييرات المقترحة ولدي بعض الملاحظات.

  1. إذا احتفظت بـ DataProvider في فئة الاختبار وقمت بتمرير اسم DataProvider إلى التعليق التوضيحي للاختبار ، فيبدو أن الاختبار يحاول التشغيل بالتوازي ولكني أرى الأخطاء التالية:
...
... 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. إذا قمت بنقل DataProvider مرة أخرى إلى فئة DataProviderManager.java الخاصة بي وحاولت التشغيل باستخدام DataProvider الذي تم تمريره إلى التعليق التوضيحي للاختبار ، يبدو مرة أخرى أنه يحاول التشغيل بالتوازي ولكني أرى ما يلي وهو خطأ مختلف:
...
... 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
===============================================

اي افكار في هذا؟

هل يمكنك مشاركة رمز الاختبار الذي استخدمته لتشغيل الخطأ؟

أنا أستخدم ملف Testing.xml الدقيق الذي قمت بلصقه أعلاه (من الواضح أن الفصل يشير إلى فئة الاختبار الخاصة بي في الحزمة الخاصة بي). ها هو موقع 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"}
        };
    }
}

ها هو صفي الاختباري

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

}

إذا كنت ترغب في اختبار السيناريو الأول ، فقم بإلغاء التعليق على ما هو موجود في الاختبار. بالنسبة للسيناريو 2 ، يمكنك تشغيلها كما هي

VinceBarresi - ترجع المشكلة في كلتا الحالتين إلى كود الاختبار الخاص بك. لا أعتقد أن TestNG مخطئ هنا.

السيناريو 1

يظهر الخطأ org.testng.internal.reflect.MethodMatcherException: Data provider mismatch لأنك تربط طريقة الاختبار public void openSiteTest() بموفر بيانات يقوم بإرجاع 3 معلمات defaultWebDataProvider() لكن أسلوب الاختبار الخاص بك لا يحتوي على أي وسيطات طريقة في الكل. أنت بحاجة إلى التأكد من أن طريقة الاختبار ومزود البيانات الذي ترتبط به ، يتطابقان في المعلمات من حيث الطول والنوع وترتيب المعلمات. يرجى تصحيح رمز الاختبار الخاص بك.

السيناريو 2

الخطأ Method public void com.msg.test.coretest.uitests.msgdotcom.MSGWebExampleTest.openSiteTest() requires a <strong i="15">@DataProvider</strong> named : defaultWebDataProvider يعود مرة أخرى إلى مشكلة في كود الاختبار الخاص بك. لقد نقلت موفر البيانات إلى فئة مختلفة باسم DataProviderManager . ولكن في طريقة @Test بك ، فأنت تشير فقط إلى مزود البيانات بالاسم. بشكل افتراضي ، إذا لم تقدم اسم الفئة حيث يوجد مزود البيانات الخاص بك ، فسيبحث TestNG دائمًا عن مزود البيانات في الفصل الحالي. منذ ذلك الحين لم يتم العثور على شكاوى TestNG. مرة أخرى ، تحتاج إلى إصلاح رمز الاختبار الخاص بك بحيث تشير إلى مزود البيانات بشكل صحيح.

نظرًا لأن المشكلة الأصلية تم حلها ، فأنا أغلق هذه المشكلة بالحل عند الإجابة على السؤال

krmahadevan هذا سوء فهم لـ DataProvider من جانبي - نظرًا لأنني لست بحاجة إلى المعلمات التي تم تمريرها منه في الاختبار نفسه (أحتاجها في حواجز ومحددات الترابط الخاصة بي لتمريرها إلى قدرات السيلينيوم) لم أدرك أنني بحاجة لتمريرها إلى طريقة الاختبار الفعلية. أنا حقا أقدر لك توضيح هذا الأمر!

لدي سؤال آخر حول التوازي إذا كان لديك لحظة - كيف يمكنني تعيين عدد مؤشرات ترابط موفر البيانات و / أو عدد سلاسل الرسائل بحيث تكون جميع مجموعات البيانات الخمس من

@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"} }; }
تشغيل في نفس الوقت بالضبط لكل اختبار @ ؟ يمكنني حاليًا تشغيل نفس المجموعة (مثل "chrome" ، "70" ، "Windows 10") n عدد مرات الخيط بدلاً من تشغيل كل مجموعة في نفس الوقت.

يجب أن تستخدم مصنعًا (تعليق توضيحي @Factory ) مع مزود البيانات.

يستخدم المصنع موفر البيانات لإنشاء مثيلات فئة الاختبار بشكل أساسي (فئة تضم طريقة أو أكثر @Test ) ، وبعد ذلك عند تشغيلها ، سيضمن TestNG أنها ستشغل جميع طرق الاختبار في مثيل (استخدم السمة parallel=instances )

krmahadevan أنا أستخدم Factory الذي يقوم بإعداد القدرات بما في ذلك المتصفح والإصدار والنظام الأساسي من DataProvider الخاص بي وتهيئة مثيلات مؤشر الترابط الآمن من WebDriver. إذا قمت بتعيين (متوازي = مثيلات) ، فسيتم تشغيل الاختبار بالتوازي ولكن يتم تشغيل مثيلات متعددة باستخدام نفس المتصفح والإصدار والنظام الأساسي من DataProvider الخاص بي كما ترى أدناه:

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

بدلاً من تشغيل خيوط متعددة لكل منهم على Safari ، 12 ، Mac 10.13 ، أحاول إجراء الاختبار باستخدام سلاسل رسائل متعددة بالتوازي مع -

كائن جديد [] {"chrome"، "70"، "Windows 10"} ، يجب أن يكون هذا الخط 1
كائن جديد [] {"internet explorer"، "11"، "Windows 10"} ، يجب أن يكون هذا الخط 2
كائن جديد [] {"safari"، "12.0"، "Mac 10.13"} ، يجب أن يكون هذا الخط 3
كائن جديد [] {"chrome"، "70"، "Mac 10.13"} ، يجب أن يكون هذا الخط 4
كائن جديد [] {"firefox"، "63"، "Mac 10.13"} يجب أن يكون هذا THREAD 5

VinceBarresi - لقد أضفت إجابة مفصلة على سؤالك حول تجاوز سعة المكدس.

للختام باختصار ، عند استخدام @Factory مع @DataProvider لإنتاج مثيلات فئة الاختبار ، يقوم TestNG بإنشاء مثيلات فئة الاختبار بالتوازي ، ولكن يتم تشغيل كل من @Test الطرق في كل فئة من فئات الاختبار بالتسلسل.

krmahadevan كان ردك على StackOverflow مفيدًا جدًا ، شكرًا لك!

سؤال واحد: لنفترض أنك تستخدم نفس مزود البيانات لكل اختبار. هل هناك طريقة يمكننا من خلالها تجنب تكرار رمز المصنع في كل فئة؟

شكرا!

borbamartin - هل يمكن أن يكون كل ما تبذلونه @Factory المصانع بالطاقة يشتركان فى نفس موفر البيانات باستخدام dataProviderClass السمة في @Factory الشرح.

كان ردك على موقع StackOverflow مفيدًا جدًا ، شكرًا لك!

يسعدني أن أعرف أنه ساعدك 👍

krmahadevan نعم ، دعني أعيد

لنفترض أن لدي 50 فئة ميزات تحتوي كل منها على اختبارات متعددة. هذا يعني أنني يجب أن أكتب الخمسين مرة التالية (في كل فصل)

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

السؤال هو ، هل يوفر TestNG شيئًا يمكنني استخدامه لتجنب كتابة هذا في كل فصل اختبار؟

شكرا مرة آخرى!

borbamartin - على حد علمي ، لا يوجد شيء في TestNG من شأنه أن يفعل ذلك تلقائيًا من أجلك. سوف تحتاج إلى القيام بذلك بنفسك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات