JavaRush /جاوا بلاگ /Random-UR /JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا...
Sdu
سطح

JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا۔

گروپ میں شائع ہوا۔
اپنے کام کو چیک کرنے کے لیے درجنوں بار کنسول میں ٹیسٹ ڈیٹا ٹائپ کرکے تھک گئے ہیں؟ بلی میں خوش آمدید، میں آپ کو بتاؤں گا کہ آپ اس کے ساتھ کیا کر سکتے ہیں۔ اس مواد کا حتمی مقصد مختلف پیرامیٹرز کے ساتھ حل کیے جانے والے کام کے آغاز کو خودکار بنانا اور اس کے سورس کوڈ میں تبدیلی کیے بغیر نتائج کی جانچ کرنا ہوگا۔ جیسا کہ آپ شاید پہلے ہی عنوان سے سمجھ چکے ہوں گے، اس آسان معاملے میں ہمارا مرکزی معاون JUnit ہوگا ۔ اگر آپ نے ابھی تک یونٹ ٹیسٹنگ اور یونٹ ٹیسٹ کے بارے میں نہیں سنا ہے تو میرا مشورہ ہے کہ آپ تھوڑا سا وقفہ لیں اور اپنے آپ کو ان تصورات سے واقف کر لیں، خوش قسمتی سے انٹرنیٹ پر کافی معلومات موجود ہیں۔ نہیں، آپ نہیں چاہتے؟ ٹھیک ہے، ٹھیک ہے، مجھے لگتا ہے کہ کیا ہو رہا ہے اسے سمجھنے کے لیے یہ کوئی بڑا مسئلہ نہیں بنے گا۔ سب کے بعد، آپ جانتے ہیں کہ عام طور پر ٹیسٹ اور ٹیسٹ کیا ہیں؟ آپ ایسا ہر بار کرتے ہیں جب آپ اپنا ٹاسک شروع کرتے ہیں، ابتدائی ڈیٹا درج کریں اور نتیجے کے نتائج کا موازنہ اس سے کریں جس کی آپ کو توقع تھی۔
ہیلو، ورلڈ JUnit!
JUnit کیا ہے؟ پروجیکٹ کی سرکاری ویب سائٹ پر ہم درج ذیل تفصیل پڑھ سکتے ہیں:
JUnit دوبارہ قابل ٹیسٹ لکھنے کے لیے ایک سادہ فریم ورک ہے۔ یہ یونٹ ٹیسٹنگ فریم ورک کے لیے xUnit فن تعمیر کی ایک مثال ہے۔
ہمارے لیے، اس کا مطلب یہ ہے کہ خاص طور پر ڈیزائن کی گئی کلاسیں لکھنے کی صلاحیت جن کے طریقے ہمارے پروگرام کے ساتھ تعامل کریں گے، نتیجے کے نتیجے کا حوالہ کے ساتھ موازنہ کریں اور اگر وہ مماثل نہ ہوں تو ہمیں مطلع کریں۔ اصول کو سمجھنے کے لیے ایک سادہ سی مثال پر غور کریں۔ فرض کریں کہ ہمارے پاس ایک معاون کلاس ہے، جس کا ایک طریقہ int قسم کے دو متغیرات لیتا ہے اور ان کا مجموعہ واپس کرتا ہے: JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا۔  - 1 یہ وہ فعالیت ہے جسے ہم جانچنے کی کوشش کریں گے۔ خوش قسمتی سے، ہمارے پسندیدہ IDEA کے پاس پہلے سے ہی وہ سب کچھ موجود ہے جس کی آپ کو تیزی سے ٹیسٹ بنانے کے لیے درکار ہے، ہمیں بس کرسر کو کلاس ڈیکلریشن لائن میں رکھنے کی ضرورت ہے، "Alt + Enter" دبائیں اور سیاق و سباق کے مینو میں "Create Test" کو منتخب کریں: JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا۔  - 2 آپ یہ بتانے کے بعد کہ کہاں آپ کو ایک ٹیسٹ بنانا چاہیے، IDEA ٹیسٹنگ لائبریری کا انتخاب کرنے کا مشورہ دیتا ہے (اس مواد میں میں JUnit4 استعمال کرتا ہوں؛ لائبریری کی کلاسز کو پروجیکٹ سے منسلک کرنے کے لیے، آپ کو "فکس" بٹن پر کلک کرنے کی ضرورت ہے)، جانچنے کے طریقے اور اضافی اختیارات. JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا۔  - 3 IDE ایک ٹیسٹ کلاس ٹیمپلیٹ بنائے گا: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا۔  - 4 ہمیں صرف میتھڈ باڈی کو بھرنے کی ضرورت ہے۔ JUnit کے ذریعہ فراہم کردہ نام نہاد "Assertions" اس میں مدد کریں گے ۔ ایک آسان طریقے سے، ان کا کام کچھ اس طرح نظر آتا ہے: ٹیسٹ کے تحت طریقہ کار کو کال کرنے کا متوقع نتیجہ اور نتیجہ .assert* طریقہ میں منتقل کیا جاتا ہے؛ سہولت کے لیے، آپ پہلے پیرامیٹر کے طور پر ایک وضاحتی پیغام شامل کر سکتے ہیں۔ اگر ٹیسٹ کے دوران پیرامیٹرز مماثل نہیں ہوتے ہیں، تو آپ کو اس بارے میں مطلع کیا جائے گا۔ آپ باقاعدہ کلاس کی طرح عمل درآمد کے لیے ٹیسٹ کلاس شروع کر سکتے ہیں، میں کلیدی مجموعہ Ctrl+Shift+F10 استعمال کرنے کو ترجیح دیتا ہوں JavaRush کے لیے JUnit یا گھر پر جانچ کے بارے میں تھوڑا سا۔  - 5
آئیے کام کی وضاحت کریں۔
نظریہ میں، ہر چیز سادہ اور خوبصورت ہے، لیکن مجوزہ مثال کے تناظر میں، یہ واقعی ضروری نہیں ہے؛ ہم کمپیوٹر پر دو نمبروں کو شامل کرنے پر بھروسہ کر سکتے ہیں۔ ہم اس بات میں زیادہ دلچسپی رکھتے ہیں کہ JavaRush کے طلباء کے ذریعے حل کیے گئے حقیقی مسائل کے ساتھ چیزیں کیسے چلیں گی؛ مثال کے طور پر، میں محبوب لیول05.lesson12.bonus03 لینے کا مشورہ دیتا ہوں۔
/* الگورتھم پر مسئلہ ایک پروگرام لکھیں جو: 1. کنسول سے نمبر N > 0 داخل کرتا ہے 2. پھر کنسول 3 سے N نمبر داخل کرتا ہے۔ درج کردہ N نمبروں کی زیادہ سے زیادہ ظاہر کرتا ہے۔ */
ہمیں مثبت، منفی نمبروں اور ایک مخلوط سیٹ کے لیے تین ٹیسٹ لکھنے کی ضرورت ہے۔
آگے جنگل میں...
یہ وہ جگہ ہے جہاں کچھ حیرتیں ہمارے منتظر ہیں: public class UtilApp { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //напишите здесь ваш code int n; int maximum; /* Конечно же я не буду размещать решение задачи ;) Код приведенный тут переработан для наглядности, и не в коем случае не означает что он должен присутствовать в "правильном решении" */ System.out.println(maximum); } }
  • پروگرام کی منطق کو مین () طریقہ میں رکھا گیا ہے۔
  • ماخذ ڈیٹا کو طریقہ کار میں منتقل نہیں کیا جاتا ہے، لیکن کی بورڈ سے داخل کیا جاتا ہے۔
  • main() طریقہ نتیجہ واپس نہیں کرتا، لیکن اسے کنسول میں آؤٹ پٹ کرتا ہے۔
اگر پہلا نکتہ خاص طور پر مشکل نہیں ہے (ہم معمول کے مطابق مین () طریقہ کہہ سکتے ہیں)، تو اگلے دو ہمیں موضوع کی گہرائی میں جانے اور اپنے دماغ پر دباؤ ڈالنے پر مجبور کرتے ہیں۔ مجھے اس مسئلے کے کئی حل ملے:
  1. زیادہ سے زیادہ تلاش کرنے کے لیے منطق کو الگ طریقہ میں منتقل کرنا۔
    • پیشہ: ری فیکٹرنگ کے معاملے میں درست نقطہ نظر
    • نقصانات: پروگرام کوڈ، غیر ضروری ڈھانچے کے ساتھ بہت زیادہ ہو جاتا ہے، کم از کم ایک سرنی یا ArrayList شامل کیا جاتا ہے (ذائقہ اور رنگ پر منحصر ہے...)۔ صرف زیادہ سے زیادہ تلاش کرنے کے طریقہ کار کی جانچ کی جاتی ہے؛ ڈیٹا ان پٹ اور آؤٹ پٹ کو چیک نہیں کیا جاتا ہے۔
  2. System.in/System.out کے لیے ریپر لکھنا۔
    • پیشہ: ہم تھرڈ پارٹی لائبریریوں کا استعمال نہیں کرتے ہیں۔
    • Cons: راستہ beginners کے لئے نہیں ہے. ٹیسٹ کے نفاذ کی نسبتاً پیچیدگی؛ ٹیسٹ میں کوڈ کی مقدار ٹیسٹ کیے جانے والے کام سے زیادہ ہو سکتی ہے۔
  3. ٹیسٹ کے لیے اضافی لائبریریوں کا استعمال۔
    • پیشہ: ٹیسٹ میں صاف کوڈ، ٹیسٹ لکھنے میں نسبتا آسانی۔ ٹیسٹ کے تحت کلاس کا سورس کوڈ تبدیل نہیں کیا گیا ہے۔
    • Cons: تھرڈ پارٹی لائبریریوں کو پروجیکٹ سے مربوط کرنے کی ضرورت ہے۔
سچ پوچھیں تو، مجھے تیسرا آپشن سب سے زیادہ پسند آیا، تو آئیے اسے نافذ کرنے کی کوشش کریں۔
سسٹم رولز
ایک مختصر تلاش مجھے صفحہ http://stefanbirkner.github.io/system-rules/ پر لے گئی ، اور یہ فوری طور پر واضح ہو گیا کہ مجھے یہی ضرورت تھی۔
جانچ کوڈ کے لیے JUnit قواعد کا مجموعہ جو java.lang.System استعمال کرتا ہے۔
تو آئیے لائبریری کو ڈاؤن لوڈ کرتے ہیں ۔ سسٹم رولز کے کام کرنے کے لیے درکار کامنز IO لائبریری کو ڈاؤن لوڈ کریں ۔ ہم دونوں لائبریریوں کو اپنے پروجیکٹ (فائل -> پروجیکٹ اسٹرکچر -> لائبریریز -> + -> جاوا) سے جوڑتے ہیں اور مجسمہ سازی شروع کرتے ہیں: لانچ کے بعد، ہمارا کام آپ سے کنسول سے N+1 نمبر درج کرنے کو کہتا ہے، جہاں پہلا نمبر آپ کو بتاتا ہے۔ کتنی تعداد اس کا پیچھا کرے گی. سسٹم رولز میں، TextFromStandardInputStream کلاس کو ان مقاصد کے لیے استعمال کیا جاتا ہے۔ ابتدائی طور پر، ہمیں اپنی ٹیسٹ کلاس میں اس قسم کا ایک فیلڈ شامل کرنا ہوگا اور اسے @Rule تشریح کے ساتھ نشان زد کرنا ہوگا: @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); پھر، براہ راست ٹیسٹ کے طریقہ کار میں ہم ضروری ڈیٹا کی نشاندہی کرتے ہیں: systemInMock.provideText("4\n2\n6\n1\n3\n"); جیسا کہ آپ دیکھ سکتے ہیں، نمبرز کو متن کی شکل میں منتقل کیا جاتا ہے اور ایک ہائفن سٹرنگز "\n" سے الگ کیا جاتا ہے۔ اس کی بنیاد پر، پتہ چلتا ہے کہ N 4 کے برابر ہوگا، اور ہم نمبروں سے زیادہ سے زیادہ تلاش کریں گے {2, 6, 1, 3}۔ اگلا، ہمیں ٹیسٹ کے تحت کلاس کی ایک مثال بنانے کی ضرورت ہے اور main() طریقہ کو کال کرنا ہوگا۔ ہمارا پروگرام systemInMock سے ڈیٹا پڑھتا ہے، اس پر کارروائی کرتا ہے اور نتیجہ پرنٹ کرتا ہے، اور ہمیں بس اسے پڑھنا ہے اور اس کا معیار کے ساتھ موازنہ کرنا ہے۔ ایسا کرنے کے لیے، سسٹم کے قوانین ہمیں StandardOutputStreamLog کلاس فراہم کرتے ہیں۔ ہم مخصوص قسم کا ایک فیلڈ شامل کرتے ہیں: @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); آپ .getLog() طریقہ استعمال کرکے پرنٹ شدہ ڈیٹا کو پڑھ سکتے ہیں، جب کہ آپ کو نئے حروف کی موجودگی کو مدنظر رکھنا ہوگا، حتمی اختیارات اس طرح ہوسکتے ہیں: assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); // or assertEquals("{2, 6, 1, 3}, max = 6", "6\r\n", log.getLog()); ٹیسٹوں کے درمیان، تاکہ ڈیٹا لیئرنگ سے گریز کریں، آپ کو لاگ صاف کرنے کی ضرورت ہے log.clear(); میری ٹیسٹ کلاس کا مکمل متن: import org.junit.Rule; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.contrib.java.lang.system.TextFromStandardInputStream; import static org.junit.Assert.*; import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.emptyStandardInputStream; public class UtilAppTest { @Rule public final TextFromStandardInputStream systemInMock = emptyStandardInputStream(); @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Test public void testAddition() throws Exception { systemInMock.provideText("4\n2\n6\n1\n3\n"); UtilApp utilApp = new UtilApp(); utilApp.main(new String[]{}); assertEquals("{2, 6, 1, 3}, max = 6", "6", log.getLog().trim()); systemInMock.provideText("5\n-100\n-6\n-15\n-183\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{-100, -6, -15, -183, -1}, max = -1", "-1", log.getLog().trim()); systemInMock.provideText("3\n2\n0\n-1\n"); log.clear(); utilApp.main(new String[]{}); assertEquals("{2, 0, -1}, max = 2", "2", log.getLog().trim()); } } ہم لانچ کرتے ہیں اور لطف اندوز ہوتے ہیں۔ -=!!! اہم!!!=- یہ مواد صرف معلوماتی مقاصد کے لیے فراہم کیا گیا ہے؛ میں سرور پر ٹاسک کی کامیاب جانچ کی ضمانت نہیں دیتا اگر ٹاسک کے ساتھ پیکج میں کوئی خارجی کلاس موجود ہو۔ سرور کو تصدیق کے لیے کوئی کام بھیجنے سے پہلے، ہر چیز کو ہٹا دیں: غیر ضروری فائلیں، غیر ضروری کلاسز، کمنٹ آؤٹ کوڈ۔ آپ کے بنائے گئے ٹیسٹوں کی کامیاب تکمیل سرور پر ٹیسٹوں کے کامیاب ہونے کی ضمانت نہیں دیتی۔ میں نے جان بوجھ کر نظریاتی مواد کو نہیں چبایا: یونٹ ٹیسٹنگ کا نظریہ، JUnit تشریحات، دعوی، وغیرہ، تمام مواد متن میں فراہم کردہ لنکس میں ہے۔ شاید آپ کے پاس کاموں کی جانچ کے اپنے طریقے ہیں، مجھے تبصرے میں آپ کے ساتھ ان پر بات کرنے میں خوشی ہوگی۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION