TestNG vs JUnit - الفرق بينهما
الفرق الرئيسي بين TestNG و JUnit
- TestNG هو Javaالإطار القائم، في حين JUnit هو إطار عمل اختبار الوحدة مفتوح المصدر لـ JAVA.
- مقارنة TestNG Vs JUnit, TestNG التعليقات التوضيحية أسهل في الاستخدام والفهم من JUnit.
- TestNG يسمح لنا بإنشاء اختبارات موازية، في حين أن JUnit لا يدعم تشغيل اختبارات متوازية.
- In TestNG، يمكن تجميع حالات الاختبار معًا أثناء وجودك فيها JUnit، مجموعةping لا يمكن إجراء الاختبارات معًا.

ما هي تفاصيل TestNG?
TestNG هو إطار عمل لاختبار الأتمتة حيث يرمز NG إلى "الجيل القادم". TestNG مستوحاة من JUnit الذي يستخدم التعليقات التوضيحية (@). TestNG يتغلب على عيوب JUnit وهي مصممة لجعل اختبار شامل سهل.
باستخدام TestNG، يمكنك إنشاء تقرير مناسب، ويمكنك بسهولة معرفة عدد حالات الاختبار التي تم اجتيازها وفشلها وتخطيها. يمكنك تنفيذ حالات الاختبار الفاشلة بشكل منفصل.
ما هو جونيت؟
JUnit هي وحدة مفتوحة المصدر الاختبار إطار جافا. إنه مفيد ل Java المطورون لكتابة وتشغيل اختبارات قابلة للتكرار. قام إريك جاما وكينت بيك بتطويره في البداية. إنه مثال لهندسة xUnit. وكما يوحي الاسم، يتم استخدامه لـ وحدة التجارب من قطعة صغيرة من التعليمات البرمجية.
يجب على المطورين الذين يتبعون منهجية الاختبار كتابة وتنفيذ اختبار الوحدة أولاً قبل أي كود.
بمجرد الانتهاء من الكود، يجب عليك تنفيذ جميع الاختبارات، ويجب أن تنجح. في كل مرة تتم إضافة أي رمز، تحتاج إلى إعادة تنفيذ جميع حالات الاختبار والتأكد من عدم كسر أي شيء.
الخلافات بين JUnit و TestNG
يبلغ قطر كلاً من TestNG و JUnit4 تبدو متشابهة، باستثناء ميزة واحدة أو اثنتين. دعونا نجري مقارنة بين الاثنين لنقرر بسرعة ما هي التكنولوجيا الأكثر ملاءمة لاختبار الوحدة. يسلط الجدول أدناه الضوء على الميزات التي يدعمها كل منهما:
الشروح
يبلغ قطر كلاً من JUnit و TestNG يستخدم التعليقات التوضيحية وتبدو جميع التعليقات التوضيحية تقريبًا متشابهة.
TestNG يستخدم @BeforeMethod و@AfterMethod المشابه لـ @Before و@After JUnit4.
يبلغ قطر كلاً من TestNG ويستخدم Junit4 @Test(timeout = 1000) لانتهاء المهلة. راجع الجدول أدناه لمزيد من التفاصيل-
| SN | الوصف | TestNG | JUnit 4 |
|---|---|---|---|
| 1 | شرح الاختبار | @اختبار | @اختبار |
| 2 | يتم تنفيذه قبل استدعاء طريقة الاختبار الأولى في الفصل الحالي | @قبل الفصل | @قبل الفصل |
| 3 | يتم تنفيذه بعد جميع طرق الاختبار في الفصل الحالي | @بعد الفصل | @بعد الفصل |
| 4 | يتم تنفيذه قبل كل طريقة اختبار | تضمين التغريدة | @قبل |
| 5 | ينفذ بعد كل طريقة اختبار | تضمين التغريدة | @بعد |
| 6 | تعليق توضيحي لتجاهل الاختبار | @اختبار (تمكين = خطأ) | @يتجاهل |
| 7 | ملاحظة للاستثناء | @Test(expectedExceptions = ArithmeticException.class) | @Test(المتوقع = ArithmeticException.class) |
| 8 | مهلة | @اختبار (المهلة = 1000) | @اختبار (المهلة = 1000) |
| 9 | يتم تنفيذه قبل جميع الاختبارات في المجموعة | تضمين التغريدة | ن / أ |
| 10 | ينفذ بعد كل الاختبارات في الجناح | تضمين التغريدة | ن / أ |
| 11 | ينفذ قبل تشغيل الاختبار | @قبل الاختبار | ن / أ |
| 12 | ينفذ بعد تشغيل الاختبار | تضمين التغريدة | ن / أ |
| 13 | يتم تنفيذه قبل استدعاء طريقة الاختبار الأولى التي تنتمي إلى أي من هذه المجموعات | تضمين التغريدة | ن / أ |
| 14 | قم بالتشغيل بعد طريقة الاختبار الأخيرة التي تنتمي إلى أي من المجموعات هنا | تضمين التغريدة | ن / أ |
اختبار الجناح
تُستخدم الأجنحة لتنفيذ اختبارات متعددة معًا. يمكن إنشاء الأجنحة باستخدام كليهما TestNG و JUnit4. ومع ذلك، فإن الأجنحة أقوى في TestNG لأنه يستخدم طريقة مختلفة جدًا لتنفيذ الاختبارات. دعونا نفهم ذلك باستخدام مقتطف الشفرة كما هو موضح أدناه:
باستخدام JUnit4
يصف الفصل أدناه استخدام الجناح أثناء العمل معه JUnit4:
package guru99.junit;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
SuiteTest1.class,
SuiteTest2.class,
})
public class JunitTest {
// This class remains empty,it is used only as a holder for the above annotations
}
باستخدام TestNG
TestNG يستخدم لغة XML لتجميع كافة الاختبارات في مكان واحد. ويوضح أدناه استخدام مجموعة XML أثناء العمل معها TestNG:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > <suite name="My test suite"> <test name="testing"> <classes> <class name="com.guru99.SuiteTest1" /> <class name="com.guru99.SuiteTest2" /> </classes> </test> </suite>
تجاهل الاختبار
باستخدام كليهما يمكننا تخطي الاختبار. دعونا نرى ذلك باستخدام مثال التعليمات البرمجية كما هو موضح أدناه:
باستخدام JUnit4
يصف مقتطف الكود أدناه استخدام التعليق التوضيحي @ignore أثناء العمل معه JUnit4:
@Ignore
public void method1()
{
System.out.println("Using @Ignore , this execution is ignored");
}
باستخدام TestNG
يصف مقتطف التعليمات البرمجية الموجود أدناه استخدام التعليق التوضيحي @Test(enabled=false) أثناء العمل معه TestNG:
@Test(enabled=false)
public void TestWithException()
{
System.out.println("Method should be ignored as it's not ready yet");
}
اختبار الاستثناء
اختبار الاستثناء متاح في كل من TestNG و JUnit4. يتم استخدامه للتحقق من الاستثناء الذي تم طرحه من الاختبار؟
باستخدام JUnit4
يصف مقتطف الكود أدناه استخدام اختبار الاستثناء أثناء العمل معه JUnit4:
@Test(expected = ArithmeticException.class)
public void divideByZero()
{
Int i = 1/0;
}
باستخدام TestNG
يصف مقتطف الكود أدناه استخدام اختبار الاستثناء أثناء العمل معه TestNG:
@Test(expectedExceptions = ArithmeticException.class)
public void divideByZero()
{
Int i = 1/0;
}
مهلة
تم تنفيذ هذه الميزة في كل من TestNg و JUnit4.يتم استخدام المهلة لإنهاء الاختبار الذي يستغرق وقتًا أطول من الوقت المحدد (بالمللي ثانية).
باستخدام JUnit4
يصف مقتطف الكود أدناه استخدام اختبار المهلة أثناء العمل JUnit4:
@Test(timeout = 1000)
public void method1()
{
while (true);
}
باستخدام TestNG
يصف مقتطف الكود أدناه استخدام اختبار المهلة أثناء العمل TestNG:
@Test(timeOut = 1000)
public void method1()
{
while (true);
}
اختبار المعلمات
JUnit يوفر نهجًا أسهل وأسهل للقراءة للاختبار المعروف باسم الاختبار المعلمي. TestNG و JUnit يدعم الاختبار ذو المعلمات ولكنه يختلف في طريقة تحديد قيمة المعلمة. دعونا نرى هذا واحدا تلو الآخر.
باستخدام JUnit4
يتم استخدام التعليقات التوضيحية "@RunWith" و"@Parameter" لتوفير قيمة المعلمة لاختبار الوحدة. يجب أن يُرجع التعليق التوضيحي @Parameters القائمة [] . سيتم تمرير هذه المعلمة إلى مُنشئ الفئة كوسيطة.
@RunWith(value = Parameterized.class)
public class JunitTest{
privateint number;
public JunitTest6(int number)
{
this.number = number;
}
@Parameters
public static Collection<Object[]> data()
{
Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };
returnArrays.asList(data);
}
@Test
public void parameterTest()
{
System.out.println("Parameterized Number is : " + number);
}
}
باستخدام TestNG
In TestNGأو يتم استخدام ملف XML أو "@DataProvider" لتوفير معلمة للاختبار.
هنا، يحتاج التعليق التوضيحي @Parameters المعلن في الطريقة إلى معلمة للاختبار. سيتم توفير البيانات المستخدمة كمعلمة TestNGملفات تكوين XML. من خلال القيام بذلك، يمكننا إعادة استخدام واحدة حالة الاختبار مع مجموعات بيانات مختلفة، ويمكننا الحصول على نتائج مختلفة.
public class Test1 {
@Test
@Parameters(value="number")
public void parameterTest(int number)
{
System.out.println("Parameterized Number is : " + number);
}
}
انظر أدناه ملف xml لاستخدامه في الفصل أعلاه:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="testing">
<parameter name="number" value="2"/>
<classes>
<class name="com.guru99.Test1" />
</classes>
</test>
</suite>
ملخص
شاهدنا JUnitو4 TestNG مقارنة تفصيلية. لقد رأينا أيضًا أن كلاهما متشابهان باستثناء الاختبار المعلمي واختبار التبعية. باختصار، يمكننا القول، بناءً على المرونة والمتطلبات، يمكننا اختيار أي منهما لاختبار الوحدة.

