Testng: أضف واجهة برمجة تطبيقات لإدخال معلمة طريقة الاختبار المخصصة

تم إنشاؤها على ٣ مارس ٢٠١٥  ·  12تعليقات  ·  مصدر: cbeust/testng

أحتاج إلى طريقة لإدخال معلمة مخصصة في طرق اختبار TestNG. المعلمة هي كائن خاص بي يتم إنشاؤه ديناميكيًا في وقت التشغيل من التعليقات التوضيحية لأسلوب الاختبار . المعلمة المخصصة غير معروفة لـ TestNG ، إنها من النوع الخاص بي ، على سبيل المثال:

@com.mypackage.MyAnnotation("someValue)"
@org.testng.Test
public void test(MyCustomObject val) {
    ...
}

يبدو الآن أنني لا أستطيع القيام بذلك بسهولة.

هل يمكننا إضافة هذه الوظيفة / SPI؟ ما هي أسهل طريقة حالية لتحقيق ذلك؟

injection Feature request

التعليق الأكثر فائدة

سيكون مفيدا جدا لدي نفس الاحتياجات

ال 12 كومينتر

لا أريد استخدام تعليق DataProvider .

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

سيدريك

يوم الثلاثاء ، 3 مارس 2015 الساعة 6:09 صباحًا ، Crazyjavahacking [email protected]
كتب:

_لا أريد استخدام التعليق التوضيحي

قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/cbeust/testng/issues/612#issuecomment -76951265.

تكمن المشكلة في أن الكائن الذي أريد إدخاله يتم إنشاؤه ديناميكيًا استنادًا إلى البيانات الموجودة داخل التعليقات التوضيحية في طريقة الاختبار.

في المثال الأولي الخاص بي ، أحتاج إلى تحليل محتوى @MyAnnotation وبناءً على ذلك أحتاج إلى إنشاء مثيل MyCustomObject .

ما الذي يمنعك من القيام بكل ذلك في مزود البيانات؟

سيدريك

يوم الثلاثاء ، 3 مارس 2015 الساعة 3:12 مساءً ، Crazyjavahacking [email protected]
كتب:

المشكلة هي أن الكائن الذي أريد حقنه يتم إنشاؤه ديناميكيًا
بناءً على البيانات الموجودة داخل التعليقات التوضيحية على طريقة الاختبار.

في المثال الأولي ، أحتاج إلى تحليل محتوى MyAnnotation و
بناءً على ذلك ، أحتاج إلى إنشاء مثيل MyCustomObject.

قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/cbeust/testng/issues/612#issuecomment -77060429.

الوظيفة ليست اختبارًا محددًا في الواقع ولا أريد أيضًا استخدام موفري البيانات ، على سبيل المثال:

@Columns("col1 | col2 || val)"
<strong i="6">@Rows</strong>  ({"a    | b    || c",
         "d    | e    || f})
@org.testng.Test
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

@Columns("col1 | col2 || val)"
<strong i="7">@Rows</strong>  ({"1    | 2    || a",
         "3    | 3    || b})
@org.testng.Test
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

لذلك لا أعتقد أن موفري البيانات نهج جيد هنا

سيكون مفيدا جدا لدي نفس الاحتياجات

الفكرة مثيرة للاهتمام ولكن كما قال cbeust منذ وقت طويل ، فإن مزود البيانات هو حل بديل جيد.
حسب العينة السابقة:

@Columns("col1 | col2 || val)")
@Rows(  {"a    | b    || c",
         "d    | e    || f"})
@Test(dataProvider = "dp")
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

@Columns("col1 | col2 || val)"
@Rows(  {"1    | 2    || a",
         "3    | 3    || b"})
@Test(dataProvider = "dp")
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

<strong i="8">@DataProvider</strong>
public static MyCustomObject[] dp(Method m) {
    Columns colums = m.getAnnotation(Columns.class);
    Rows rows = m.getAnnotation(Rows.class);
    MyCustomObject[] results = new MyCustomObject[rows.values().length];
    for (int i=0; i < rows.values().length; i++) {
        String value = rows.values()[i];
        // extract params with custom business
        results[i] = new MyCustomObject(/* params */);
    }
    return results;
}

هذا صحيح juherr ، لقد

أعتقد أن مزيجًا من dataProvider وإضافة القدرة على تعيين مزود افتراضي أو فئة مزود خدمة افتراضية سيفي بالغرض وسيفتح فجوة في إمكانيات جديدة

@ g13013 تقصد شيئًا مثل

public class UseMyDataProvider implements IAnnotationTransformer {
  public void transform(ITest annotation, Class testClass, Constructor testConstructor, Method testMethod) {
    if (/* business logic (for example: testMethod has expected annotations) */) {
      annotation.setDataProviderClass(MyExternalClassWithDataProvider.class);
      annotation.setDataProvider("dataprovider name");
    }
  }
}

أود أيضًا أن أتمكن من استخدام Guice لحقن المعلمات في الاختبارات.
DataProvider + IAnnotationTransformer هو حل بديل مثير للاهتمام ولكنه يفتقر إلى المرونة (على سبيل المثال ، من المستحيل تعيين IAnnotationTransformer عبر Listeners)

من المستحيل ضبط IAnnotationTransformer عبر @Listeners

gjuillot يمكن أن يكون طلب ميزة. هل يمكنك فتح مشكلة في ذلك؟

سوف افعل. ولكن مع ذلك ، فإن أفضل ما بالنسبة لي هو إمكانية استخدام Guice لحقن المعلمات في الاختبارات.

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