CodeGym /جاوا بلاگ /Random-SD /جاوا ۾ يونٽ جي جاچ JUnit سان
John Squirrels
سطح
San Francisco

جاوا ۾ يونٽ جي جاچ JUnit سان

گروپ ۾ شايع ٿيل

جاوا ۾ يونٽ ٽيسٽ ڇا آهي؟

ان کان اڳ جو اسين جاوا ۾ JUnit سکڻ ۾ وڃون، اچو ته مختصر طور تي جائزو وٺون ته يونٽ ٽيسٽنگ ڇا آهي ۽ اهو ايترو مشهور ڇو آهي (جيڪڏهن توهان کي اها شيءِ اڳ ۾ ئي خبر آهي، ته 'مان جاوا ۾ JUnit ٽيسٽ ڪيئن لکان؟') ڏانهن وڃو. جاوا ۾ يونٽ جي جاچ وڏي پئماني تي سافٽ ويئر ڊولپمينٽ کي وڌيڪ موثر ۽ آسان بڻائي ٿي. اهو ٻنهي ماڻهن جي مدد ڪري سگهي ٿو، ۽ ٽيمون بيشمار ڪلاڪن کي ڊيبگنگ کان بند ڪري ٿو ۽ تعاون جي عمل کي انتهائي تيز ڪري ٿو. جاوا ۾ يونٽ جي جاچ JUnit - 1 سان

https://junit.org/junit4/

يونٽ ٽيسٽنگ جو بنيادي خيال هي آهي: انفرادي خاصيتن جا ايٽمي ٽيسٽ لکو (جنهن کي يونٽ ٽيسٽ سڏيو ويندو آهي) ۽ آهستگي سان وڌيڪ فيچرز شامل ڪريو جانچڻ کان پوءِ ۽ انهي کي يقيني بڻائڻ ته اڳين جا ڪم. اهو هڪ انتهائي سادو پر طاقتور خيال آهي. هڪ مثال جي طور تي اهو عمل ڪيئن نظر اچي سگهي ٿو، تصور ڪريو ته توهان هڪ مجازي سائنسي حساب ڪتاب ٺاهي رهيا آهيو. ظاهري رياضي آپريٽرز ( +, -, x, %) جي مٿي تي، هن ڳڻپيندڙ ۾ ترقي يافته خاصيتون هونديون جيڪي ان جي اندر ڪم ڪرڻ لاءِ ٻين ذيلي خصوصيتن جي ضرورت هونديون. خرچن کي ڳڻڻ لاءِ، توھان جي ڳڻپيوڪر کي صحيح طور تي ضرب ڪرڻ جي ضرورت آھي. تنهن ڪري هن ڳڻپيندڙ کي تعمير ڪرڻ ۽ جانچ ڪرڻ لاء هڪ يونٽ جي جانچ جو طريقو ٿيندو:
  • هڪ اضافي فنڪشن لکو. ان کي احتياط سان جانچيو، ان کي تبديل ڪريو، ورجايو جيستائين اهو ڪم ڪري.
  • ساڳيو ڪريو گھٽائڻ، ضرب، تقسيم جي ڪمن لاء.
  • انهن بنيادي آپريٽرن کي استعمال ڪريو وڌيڪ ترقي يافته آپريٽر افعال لکڻ لاءِ exponents، پوءِ انهن ڪمن کي پڻ آزمايو.
اهو يقيني بڻائي ٿو ته خاصيتون جيڪي ٻين ننڍڙن ذيلي خصوصيتن کي ٺاهيندا آهن نه صرف پنهنجي حق ۾ صحيح ڪم ڪن ٿا پر ان ۾ ناقص ذيلي خصوصيتون نه آهن. مثال طور، جيڪڏهن مان exponent فنڪشن کي جانچي رهيو آهيان ۽ ڪجهه غلط ٿي رهيو آهي، مون کي خبر آهي ته اهو بگ شايد ضرب جي ذيلي فيچر ۾ نه آهي، ڇاڪاڻ ته ضرب فنڪشن اڳ ۾ ئي وڏي پيماني تي آزمايو ويو هو. اهو تمام گهڻو ختم ڪري ٿو ڪوڊ جي ڪل رقم جنهن کي مون کي پٺتي پيل ڪرڻ ۽ بگ ڳولڻ لاءِ معائنو ڪرڻ جي ضرورت آهي. اميد آهي ته، هي ننڍڙو مثال واضح ڪري ٿو ته يونٽ ٽيسٽنگ جي چوڌاري سوچڻ وارو عمل ڪيئن ٺهيل آهي. پر يونٽ ٽيسٽنگ باقي سافٽ ويئر ڊولپمينٽ جي عمل سان ڪيئن لهه وچڙ ۾ اچي ٿي؟ ڇا جيڪڏهن توهان وٽ اڃا به وڌيڪ پيچيده خاصيتون آهن، جن کي ڪم ڪرڻ ۽ گڏجي ڪم ڪرڻ جي ضرورت آهي؟ يونٽ ٽيسٽنگ ان ڳالهه کي يقيني بڻائڻ لاءِ ڪافي نه آهي ته اهڙيون پيچيده خاصيتون گڏجي ڪم ڪري سگهن ٿيون. حقيقت ۾، اهو صرف سافٽ ويئر ٽيسٽنگ جي چار سطحن جو پهريون قدم آهي (آئون سرمائي خط استعمال ڪريان ٿو ڇاڪاڻ ته آئون صنعت جي معيار جو حوالو ڏيان ٿو يا سافٽ ويئر جي جاچ لاءِ سڀ کان عام طريقو). آخري ٽي مرحلا آھن انٽيگريشن ٽيسٽنگ ، سسٽم ٽيسٽنگ ، ۽ قبوليت جي جاچ . انهن سڀني جو شايد مطلب اهو آهي جيڪو توهان سوچيو ته اهي ڪندا آهن، پر مون کي واضح ڪرڻ ڏيو: انٽيگريشن ٽيسٽنگ اها آهي ته اسان انهن کي يقيني بڻائڻ لاءِ ڪنداسين جيئن مٿي ذڪر ڪيو ويو آهي، "پيچيده خاصيتون"، هڪ ٻئي سان صحيح طرح سان رابطو ڪن. (مثال طور، پڪ ڪريو ته ڪليڪٽر ”3 + 7 * 4 - 2“ کي سنڀالي سگھي ٿو) سسٽم ٽيسٽنگ هڪ خاص سسٽم جي مجموعي ڊيزائن کي جانچيندي آهي. اتي اڪثر پيچيده خصوصيتن جا گھڻا سسٽم آھن جيڪي ھڪڙي پيداوار ۾ گڏجي ڪم ڪن ٿا، تنھنڪري توھان انھن کي سسٽم ۾ گروپ ڪريو ۽ انھن کي انفرادي طور تي آزمايو. (مثال طور جيڪڏهن توهان گرافنگ ڳڻپيوڪر ٺاهي رهيا آهيو، توهان پهريان انگن سان ڊيل ڪرڻ لاءِ رياضي وارو ’سسٽم‘ ٺاهيندا، ٽيسٽ ڪندا جيستائين اهو ڪم ڪندو جيئن ارادو ڪيو وڃي، ۽ پوءِ توهان گرافنگ ’سسٽم‘ ٺاهيندا ۽ جانچ ڪندا ته جيئن واپس وٺڻ لاءِ. اهو رياضياتي نظام جي تعمير ڪندو). قبوليت جي جانچ آهي صارف جي سطح جي جاچ؛ اهو ڏسي رهيو آهي ته ڇا سڀ سسٽم هم وقت ڪم ڪري سگهن ٿا هڪ مڪمل پراڊڪٽ ٺاهڻ لاءِ جيڪو صارفين طرفان قبول ڪيو وڃي (مثال طور، صارف ڳڻپيوڪر کي جانچي رهيا آهن). سافٽ ويئر ڊولپر ڪڏهن ڪڏهن عمل جي هن آخري مرحلي کي نظر انداز ڪري سگھن ٿا، جيئن ڪمپنيون اڪثر ڪري ٻين ملازمن کي استعمال ڪندڙ (بيٽا) ٽيسٽ الڳ طور تي ترتيب ڏين ٿيون.

مان جاوا ۾ JUnit ٽيسٽ ڪيئن لکان؟

هاڻي ته توهان وٽ هڪ واضح خيال آهي فائدن ۽ يونٽ جي جاچ جون حدون، اچو ته ڪجهه ڪوڊ تي نظر وجهون! اسان استعمال ڪنداسين هڪ مشهور جاوا ٽيسٽنگ فريم ورڪ جنهن کي JUnit سڏيو ويندو آهي (ٻيو مشهور آهي TestNG، جنهن کي توهان پڻ استعمال ڪري سگهو ٿا جيڪڏهن توهان چاهيو ٿا. اهي بلڪل هڪجهڙا آهن، نحوي طور؛ TestNG JUnit کان متاثر ٿيل آهي). توھان ڊائون لوڊ ڪري سگھوٿا JUnit هتي . هن مثالي ڪوڊ لاءِ، اسان ’سائنٽيفڪ ڳڻپيوڪر‘ جي مثال کي جاري رکنداسين، جنهن جو ذڪر مون اڳ ڪيو هو؛ اهو تمام سادو آهي توهان جي مٿي جي چوڌاري لفاف ڪرڻ، ۽ ٽيسٽ ڪوڊ تمام آسان آهي. روايتي مشق اهو آهي ته توهان جي هر ڪلاس لاءِ الڳ ٽيسٽ ڪلاس لکو، تنهنڪري اسان اهو ئي ڪنداسين. اچو ته فرض ڪريو ته هن نقطي تي، اسان وٽ هڪ Math.javaفائل آهي جنهن ۾ سڀني رياضي افعال (بشمول Math.add)، ۽ اسان MathTests.javaساڳئي پيڪيج ۾ هڪ فائل لکي رهيا آهيون. ھاڻي اچو ته امپورٽ اسٽيٽمينٽس ۽ ڪلاس باڊي قائم ڪريون: (ممڪن جوونٽ انٽرويو سوال: توھان کان پڇيو وڃي ته توھان جو JUnit ٽيسٽ ڪٿي رکڻو آھي ۽ ڇا توھان کي پنھنجي ماخذ فائلن کي درآمد ڪرڻ جي ضرورت آھي يا نه. جيڪڏھن توھان پنھنجي ٽيسٽ ڪلاس لکي رھيا آھيو ساڳي پيڪيج ۾ توهان جا مکيه ڪلاس، پوءِ توهان کي ٽيسٽ ڪلاس ۾ توهان جي سورس فائلن لاءِ ڪنهن به درآمدي بيان جي ضرورت نه آهي. ٻي صورت ۾، پڪ ڪريو ته توهان پنهنجي ماخذ فائلن کي درآمد ڪري رهيا آهيو!)

import org.junit.jupiter.Test;    //gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; //less typing :) 

public class MathTests {
	//...
}
پهريون درآمد بيان اسان کي @Testهيڊر ڏئي ٿو. اسان لکندا آهيون @Testسڌو سنئون هر ٽيسٽ فنڪشن جي تعريف جي مٿان، ته جيئن JUnit ڄاڻي ته هي هڪ واحد يونٽ ٽيسٽ آهي جنهن کي الڳ الڳ هلائي سگهجي ٿو. بعد ۾، مان توهان کي ڏيکاريندس ته توهان هن هيڊر کي استعمال ڪندي مخصوص يونٽ ٽيسٽ ڪيئن هلائي سگهو ٿا. ٻيو درآمد بيان اسان کي ٽائپنگ جو ٿورو بچائي ٿو. بنيادي JUnit فنڪشن جيڪو اسان استعمال ڪندا آهيون اسان جي افعال کي جانچڻ لاءِ Assert.assertEquals()، جيڪو ٻه پيرا ميٽرس (حقيقي قدر ۽ متوقع قدر) وٺي ٿو ۽ پڪ ڪري ٿو ته اهي برابر آهن. ھي ٻيو درآمدي بيان ھجڻ اسان کي صرف ٽائپ ڪرڻ جي اجازت ڏئي ٿو ' assertEquals(...' ھر ڀيري بيان ڪرڻ جي بدران اھو ڪھڙو پيڪيج جو حصو آھي. هاڻي اچو ته هڪ تمام سادو ٽيسٽ ڪيس لکون ان جي تصديق ڪرڻ لاءِ ته 2 + 2 واقعي 4 آهي!

import org.junit.jupiter.Test; // gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; // less typing :) 


public class MathTests {
	@Test
	public void add_twoPlusTwo_returnsFour(){
	final int expected = 4;
	final int actual = Math.add(2, 2);
	assertEquals(2+2 is 4, actual, expected);
	}
}
اچو ته هر هڪ ٽيسٽ فنڪشن جي پنجن لائينن تي وڃو ۽ اهي ڇا ڪندا آهن: لائن 5: هي @Testهيڊر بيان ڪري ٿو ته هيٺ ڏنل فنڪشن جي تعريف add_twoPlusTwo_returnsFour()واقعي هڪ ٽيسٽ فنڪشن آهي جيڪو JUnit الڳ الڳ هلائي سگهي ٿو. لائن 6: هي اسان جي ٽيسٽ ڪيس لاءِ فنڪشن دستخط آهي. ٽيسٽ ڪيس هميشه تمام گهڻا آهن؛ اهي صرف هڪ مخصوص مثال جي جانچ ڪن ٿا، جهڙوڪ 2 + 2 = 4. اهو ڪنوينشن آهي توهان جي ٽيسٽ ڪيسن کي فارم ۾ نالو ڏيڻ " [function]_[params]_returns[expected]()،" جتي [function]توهان فنڪشن جو نالو آهي جنهن جي توهان جانچ ڪري رهيا آهيو، [params]اهي مخصوص مثال پيٽرولر آهن جيڪي توهان جانچ ڪري رهيا آهيو، ۽ [expected]فنڪشن جي متوقع واپسي قيمت آهي. ٽيسٽ فنڪشن لڳ ڀڳ هميشه هڪ موٽڻ جو قسم هوندو آهي ' void' ڇاڪاڻ ته سڄي فنڪشن جو مکيه نقطو هلائڻ آهي assertEquals، جيڪو ڪنسول ڏانهن ٻاهر نڪرندو ته ڇا توهان جو امتحان پاس ڪيو يا نه؛ توهان کي ڪنهن به ٻئي ڊيٽا جي ضرورت ناهي ته ڪٿي به واپس ڪيو وڃي. لڪير 7: اسان finalواپسي جي قسم جي 'متغير' جو اعلان ڪريون ٿا Math.add (int)، ۽ ان کي ڪنوينشن طرفان 'متوقع' جو نالو ڏيون ٿا. ان جي قيمت اهو جواب آهي جنهن جي اسان توقع ڪري رهيا آهيون (4). لڪير 8: اسان finalواپسي جي قسم جي هڪ 'متغير' جو اعلان ڪريون ٿا Math.add (int)، ۽ ڪنوينشن ذريعي ان کي 'حقيقي' نالو ڏيون ٿا. ان جي قيمت جو نتيجو آهي Math.add(2, 2). لڪير 9: گولڊن لائن. اها لڪير آهي جيڪا حقيقي ۽ توقع جي مقابلي ۾ آهي ۽ اسان کي ٻڌائي ٿي ته اسان امتحان پاس ڪيو صرف جيڪڏهن اهي برابر آهن. پهريون پيٽرول پاس ڪيو ويو "2 + 2 آهي 4" ٽيسٽ فنڪشن جي وضاحت آهي.

ڇا جيڪڏهن منهنجي فنڪشن کي استثنا ڏيڻ گهرجي؟

جيڪڏهن توهان جي مخصوص امتحان واري مثال کي هڪ استثنا اڇلائڻ گهرجي بجاءِ اهو چوڻ ته هڪ حقيقي ۽ متوقع قدر برابر آهن، پوءِ JUnit وٽ هيڊر ۾ هن کي واضح ڪرڻ جو هڪ طريقو آهي @Test. اچو ته هيٺ ڏنل هڪ مثال تي هڪ نظر وٺو. Math.javaفرض ڪيو ته اسان وٽ ڪال ۾ هڪ فنڪشن آهي Math.divide، اسان پڪ ڪرڻ چاهيون ٿا ته ان پٽن کي 0 سان ورهائي نه ٿو سگهجي. ان جي بدران، Math.divide(a, 0)ڪنهن به 'a' قدر کي سڏڻ جي ڪوشش ڪرڻ گهرجي ته هڪ استثنا ( ArithmeticException.class). اسان هيڊر ۾ بيان ڪريون ٿا جيئن:

import org.junit.jupiter.Test; // gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; // less typing :) 


public class MathTests {
	@Test (expectedExceptions = ArithmeticException.class)
	public void divide_byZero_throwsException() throws ArithmeticException{
	Math.divide(1, 0);
	}
}
توهان لاءِ هڪ کان وڌيڪ استثنا حاصل ڪري سگهو ٿا expectedExceptions، بس پڪ ڪريو ته بریکٹس ۽ ڪاما استعمال ڪريو توهان جي استثنا جي ڪلاسن کي لسٽ ڪرڻ لاءِ، جيئن:

expectedException = {FirstException.class, SecondException.class,}

مان جاوا ۾ پنهنجا JUnit ٽيسٽ ڪيئن هلائي سگهان ٿو؟

JUnit کي IntelliJ ۾ ڪيئن شامل ڪيو وڃي: https://stackoverflow.com/questions/19330832/setting-up-junit-with-intellij-idea توهان پنهنجو پروجيڪٽ هلائي سگهو ٿا جيئن توهان عام طور تي ٽيسٽ هلائيندا. هڪ ٽيسٽ ڪلاس ۾ سڀني ٽيسٽن کي هلائڻ سان انهن کي الفابيٽ جي ترتيب ۾ هلائي ويندي. JUnit 5 ۾، توهان ٽيگ شامل ڪندي ٽيسٽن ۾ ترجيح شامل ڪري سگھو ٿا @Order. هڪ مثال:

@TestMethodOrder(OrderAnnotation.class)
public class Tests {@Test
@Order(2)
public void a_test() {}

@Test
@Order (1)
public void b_test() {}}
جيتوڻيڪ الفابيٽ ۽ ڪوڊ ۾ a_test()اڳي اچي ٿو ، هتي کان اڳ هلندو ، ڇاڪاڻ ته 1 ترتيب ۾ 2 کان اڳ اچي ٿو. تنهن ڪري اهو سڀ ڪجهه آهي JUnit جي بنيادي ڳالهين لاءِ. ھاڻي، اچو ته ڪجھ عام JUnit انٽرويو سوالن کي حل ڪريون، ۽ رستي ۾ JUnit بابت ڪجھ وڌيڪ سکو! b_test()b_test()a_test()

JUnit انٽرويو سوال (اضافي معلومات)

هتي مون گڏ ڪيو آهي سڀ کان وڌيڪ مشهور JUnit انٽرويو سوال. جيڪڏھن توھان وٽ شامل ڪرڻ لاءِ ڪجھ آھي - ھيٺ ڏنل تبصرن ۾ اھو ڪرڻ لاءِ آزاد ٿيو. سوال: توهان پنهنجي امتحان واري طريقي ۾ ڪهڙي طريقي کي سڏي سگهو ٿا جيڪو خودڪار طريقي سان ناڪام ٿيڻ لاء؟ ج: ناڪام ("غلطي جي وضاحت هتي!")؛ عبرت: توهان هڪ ڪتي طبقي جي جاچ ڪري رهيا آهيو؛ ڪتن جي اعتراض کي جانچڻ لاءِ، توھان کي ان کي انسٽيٽيو ڪرڻ جي ضرورت آھي ان کان اڳ توھان ان تي ٽيسٽ هلائي سگھو. تنهن ڪري توهان ڪتي کي فوري ڪرڻ لاءِ هڪ setUp() فنڪشن لکو. توهان صرف هن فنڪشن کي هلائڻ چاهيو ٿا هڪ ڀيرو سڀني جاچ دوران. توهان کي سيٽ اپ () فنڪشن جي دستخط جي مٿان سڌو سنئون ڇا رکڻ گهرجي ته جيئن JUnit ٽيسٽ هلائڻ کان پهريان setUp() کي هلائڻ ڄاڻي ٿو؟ ج: @BeforeClass (@BeforeAll in JUnit 5) سوال: مٿي بيان ڪيل setUp() فنڪشن جي فنڪشن دستخط ڇا هجڻ ضروري آهي؟ ج: عوامي جامد باطل. ڪنهن به فنڪشن سان @BeforeClass (@BeforeAll in JUnit 5) يا @AfterClass (@AfterAll JUnit 5 ۾) جامد ٿيڻ جي ضرورت آهي. عبرت: توهان ڪتا ڪلاس جي جاچ ڪئي آهي. توھان لکو void tearDown() فنڪشن جيڪو ڊيٽا کي صاف ڪري ٿو ۽ معلومات کي پرنٽ ڪري ٿو ڪنسول ڪرڻ لاءِ ھر ٽيسٽ کان پوءِ. توهان چاهيو ٿا ته هي فنڪشن هر هڪ ٽيسٽ کان پوء هلائڻ لاء. توهان کي ڇا رکڻ گهرجي سڌو سنئون مٿان ٽيئر ڊائون() فنڪشن دستخط پوءِ JUnit هر ٽيسٽ هلائڻ کان پوءِ ٽيئر ڊائون() هلائڻ ڄاڻي ٿو؟ A: @After (@AfterEach JUnit 5 ۾)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION