Testng: دعم المعلمات على مستوى الأسلوب؟

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

هل من الممكن دعم المعلمات الخاصة على مستوى الطريقة؟
على سبيل المثال،

<test name="Regression1">
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod" param1="121" param2="1212"  />
      </methods>
    </class>
  </classes>
</test>

أحاول تحقيق ذلك من خلال تعديل كود testng - سأكون ممتنًا لأي توجيه / بدء لهذا.

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

في الواقع ، توجد معلمات على مستوى الأسلوب. هنا مثال:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <class name="testng.ex1.TestParams">
                <methods>
                    <include name="m1">
                        <parameter name="key1"  value="val1"/>
                        <parameter name="key2"  value="val2"/>
                    </include>
                    <include name="m2">
                        <parameter name="key1"  value="valA"/>
                        <parameter name="key2"  value="valB"/>
                    </include>
                </methods>
            </class>
        </classes>
    </test>
</suite>
package testng.ex1;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParams {

    <strong i="8">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m1(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }

    <strong i="9">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m2(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }
}

ال 12 كومينتر

لا ، يجب عليك استخدام @DataProvider لهذا الغرض.

cbeust ، التحدي مع @DataProvider هو أنه لا يمكن تعريفه من testng.xml؟ سبب تمرير هذه المعلمة ، هو أن بيانات الطريقة تأتي من قاعدة بيانات وهذه المعلمة هي المفتاح الأساسي. أريد استخدام هذا المفتاح ، وجلب البيانات ، وإنشاء كائن بيانات للطريقة في وقت التشغيل باستخدام الانعكاس. لذلك ، باختصار ، حتى إذا كنت أستخدم DataProvider ، فلا بد لي من تمرير قيمة في وقت التشغيل إليه ، للإشارة إلى مجموعة الصفوف التي يجب أن تختارها من قاعدة البيانات. يرجى ملاحظة أن هذا سيناريو مع استخدام برمجي لـ testng.

يمكنك تحديد كمية محدودة من المعلمات في testng.xml :

http://testng.org/doc/documentation-main.html#parameters -testng-xml

سيدريك

في يوم الاثنين 12 أكتوبر 2015 الساعة 9:03 مساءً ، كتب JayVem [email protected] :

cbeust https://github.com/cbeust ، التحدي مع DataProvider هو
أنه لا يمكن تعريفه من testng.xml؟ سبب تمرير هذا
المعلمة ، هي أن البيانات الخاصة بالطريقة تأتي من قاعدة بيانات وهذا
المعلمة هي المفتاح الأساسي. أريد استخدام هذا المفتاح ، وجلب البيانات ، وإنشاء ملف
كائن البيانات للطريقة في وقت التشغيل باستخدام الانعكاس. لذلك ، باختصار ، حتى
إذا كنت أستخدم DataProvider ، فلا بد لي من تمرير قيمة في وقت التشغيل إليه ، إلى
تشير إلى مجموعة الصفوف التي يجب أن تختارها من قاعدة البيانات. يرجى ملاحظة هذا
هو لسيناريو مع استخدام برمجي لـ testng.

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

cbeust أليست هذه المعلمات على مستوى المجموعة؟ ماذا لو أردت إنشاء نوع بيانات معقد على مستوى الطريقة. على سبيل المثال ، ضع في اعتبارك هذا الرمز ...

public class EmployeeBenefitsCalculator {

    <strong i="7">@Test</strong>
    public void calculateBenefits(Employee employee) {
        //do something with employee here.
    }
}

يجب إنشاء معلمة الموظف التي يتم إرسالها إلى طريقة calculateBenefits من قاعدة البيانات. كيف يمكنني تحقيق ذلك؟ أرغب في تمرير مفتاح أساسي وداخل طريقة calculateBenefits ، أريد قراءة هذا المفتاح الأساسي ، وجلب البيانات من db وإنشاء كائن موظف لهذا التشغيل التجريبي. أعلم أن الأمر يبدو معقدًا. أعتقد أن هذا ما أبحث عنه -

public class EmployeeBenefitsCalculator {

    <strong i="11">@Test</strong>
    public void calculateBenefits(Employee employee) {
        employee = DataStore.fetch("id_from_testng_xml");
    }
}

كيف يمكنني توفير معلمات لمقدم البيانات لإجراء اختبار في وقت التشغيل؟ ما مدى سهولة التغيير لإنشاء هذا السلوك عن طريق تغيير مصدر testng؟

يمكنك مزج مزود البيانات + المعلمات. سيأخذ موفر البيانات المفتاح الأساسي من المعلمة وسيقوم بإنشاء كائن الموظف الخاص بك + تمرير أي سمات أخرى. ثم ستستخدم طريقة الاختبار الخاصة بك موفر البيانات وسماته.
سهل! ؛)

juherr هل يمكن أن تعطيني مثالاً على كيف يمكنني الحصول على معاملات متعددة على مستوى الأسلوب ، كل منها يذهب إلى مزود البيانات؟

juherr لتبسيط سؤالي ، أقوم برمجيًا بإنشاء ملف testng.xml. الآن ، لنفترض أن لدي طريقة تعديل الموظف (موظف موظف). أحتاج إلى إنشاء xml بطريقة يتم فيها استدعاء هذه الطريقة 4 مرات ، ولكن في كل مرة مع موظف مختلف. سأعرف المفتاح الأساسي لكل من هؤلاء الموظفين في وقت إنشاء testng.xml. إذن ، ما هي أفضل طريقة لتحقيق ما أحاول القيام به؟

أفترض أن DataProvider يمكنه العمل مع @ Parameters لكنني لست متأكدًا (يجب أن أختبره يومًا ما).
راجع للشغل ، إذا فهمت ما تريد ، يمكنك فقط تجربة المعلمات على مستوى الاختبار (المعلمات على مستوى الطريقة غير موجودة):

<suite>
<test name="Regression1">
<parameter name="param1" value="121" />
<parameter name="param2" value="1212" />
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod"  />
      </methods>
    </class>
  </classes>
</test>

<test name="Regression2">
<parameter name="param1" value="454" />
<parameter name="param2" value="4545" />
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod"  />
      </methods>
    </class>
  </classes>
</test>
<suite>

يجب أن تطرح سؤالك على Staskoverflow أو القائمة البريدية إذا كنت تريد المزيد من الأفكار ؛)

في الواقع ، توجد معلمات على مستوى الأسلوب. هنا مثال:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <class name="testng.ex1.TestParams">
                <methods>
                    <include name="m1">
                        <parameter name="key1"  value="val1"/>
                        <parameter name="key2"  value="val2"/>
                    </include>
                    <include name="m2">
                        <parameter name="key1"  value="valA"/>
                        <parameter name="key2"  value="valB"/>
                    </include>
                </methods>
            </class>
        </classes>
    </test>
</suite>
package testng.ex1;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParams {

    <strong i="8">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m1(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }

    <strong i="9">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m2(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }
}

: +1: جيد أن تعرف! لم أره من قبل.

JayVem أغلقت المشكلة لأنها موجودة بالفعل.

طريقة أخرى هي استخدام موفر البيانات الذي يجلب المفاتيح من testng.xml. انظر المثال:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <parameter name="keys" value="key1,key2,key3,key4" />
            <class name="testng.ex2.TestParams" />
        </classes>
    </test>
</suite>
package testng.ex2;

import java.util.Arrays;
import java.util.List;

import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParams {

    @Test(dataProvider = "dp")
    public void m1(Employee e) throws Exception {
        System.out.println("name: " + e.getName() + ", age: " + e.getAge());
    }

    @DataProvider(name = "dp")
    @Parameters("keys")
    public Object[][] createData(ITestContext ctx) {
        String keysString = ctx.getCurrentXmlTest().getLocalParameters().get("keys");
        List<String> keys = Arrays.asList(keysString.split(","));

        Object[][] result = new Object[keys.size()][1];
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            result[i] = new Object[] { new Employee(key) };
        }
        return result;
    }
}

package testng.ex2;

public class Employee {

    private final String name;
    private final int age;

    public Employee(String key) {
        // use 'key' to lookup employee in database
        name = key + "_name"; // dummy value
        age = 41; // dummy value
    }

    String getName() {
        return name;
    }

    int getAge() {
        return age;
    }
}

شكرًا @ drapostolos ، أعتقد أن dataprovider مع testcontext يبدو وكأنه سيفعل. سوف أجرب هذا. شكرا جزيلا على الإجابة السريعة!

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