JavaRush /مدونة جافا /Random-AR /JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.
Sdu
مستوى

JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.

نشرت في المجموعة
هل سئمت من كتابة بيانات الاختبار في وحدة التحكم عشرات المرات للتحقق من مهمتك؟ مرحبًا بك في القطة، سأخبرك بما يمكنك فعله بها. سيكون الهدف النهائي لهذه المادة هو أتمتة إطلاق المهمة التي يتم حلها بمعلمات مختلفة والتحقق من النتائج دون إجراء تغييرات على كود المصدر الخاص بها. كما فهمت من العنوان، فإن مساعدنا الرئيسي في هذه المسألة البسيطة سيكون JUnit . إذا لم تكن قد سمعت بعد عن اختبار الوحدة واختبارات الوحدة ، أقترح عليك أن تأخذ استراحة قصيرة وتتعرف على هذه المفاهيم، ولحسن الحظ هناك معلومات كافية على الإنترنت. لا، أنت لا تريد؟ حسنا، حسنا، أعتقد أن هذا لن يصبح مشكلة كبيرة لفهم ما يحدث. ففي النهاية، هل تعرف ما هو الاختبار والاختبار بشكل عام؟ يمكنك القيام بذلك في كل مرة تقوم فيها بتشغيل مهمتك، وإدخال البيانات الأولية ومقارنة النتيجة الناتجة بما كنت تتوقع رؤيته.
مرحبًا أيها العالم JUnit!
ما هو جونيت؟ على الموقع الرسمي للمشروع يمكننا قراءة الوصف التالي:
JUnit هو إطار عمل بسيط لكتابة اختبارات قابلة للتكرار. إنه مثال على بنية xUnit لأطر اختبار الوحدة.
بالنسبة لنا، هذا يعني القدرة على كتابة فصول مصممة خصيصًا تتفاعل أساليبها مع برنامجنا، ومقارنة النتيجة الناتجة بالنتيجة المرجعية وإبلاغنا في حالة عدم تطابقها. لفهم المبدأ، فكر في مثال بسيط. لنفترض أن لدينا فئة مساعدة، تأخذ إحدى طرقها متغيرين من النوع int وتعيد مجموعهما: JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.  - 1 هذه هي الوظيفة التي سنحاول اختبارها. لحسن الحظ، فإن IDEA المفضلة لدينا لديها بالفعل كل ما تحتاجه لإنشاء الاختبارات بسرعة، كل ما نحتاجه هو وضع المؤشر في سطر إعلان الفصل، والضغط على "Alt + Enter" وتحديد "إنشاء اختبار" في قائمة السياق: JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.  - 2 بعد تحديد المكان يجب عليك إنشاء اختبار، تقترح IDEA اختيار مكتبة اختبار (في هذه المادة أستخدم JUnit4؛ لكي يتم ربط فئات المكتبة بالمشروع، تحتاج إلى النقر فوق الزر "إصلاح")، والطرق التي سيتم اختبارها والمزيد خيارات. JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.  - 3 سيقوم IDE بإنشاء قالب فئة اختبار: ClassName = TestClassName + "Test" MethodName = "test" + TestMethodName JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.  - 4 نحتاج فقط إلى ملء نص الطريقة. ما يسمى "التأكيدات" ، الأساليب التي تقدمها JUnit ، سوف تساعد في هذا . بطريقة مبسطة، يبدو عملهم كما يلي: يتم تمرير النتيجة المتوقعة ونتيجة استدعاء الطريقة قيد الاختبار إلى طريقة .assert*؛ للراحة، يمكنك إضافة رسالة توضيحية كمعلمة أولى. إذا لم تتطابق المعلمات أثناء الاختبار، فسيتم إبلاغك بذلك. يمكنك إطلاق فئة اختبار للتنفيذ تمامًا مثل الفصل العادي، أفضل استخدام مجموعة المفاتيح Ctrl+Shift+F10 JUnit لـ JavaRush أو القليل عن الاختبار في المنزل.  - 5
دعونا نحدد المهمة
من الناحية النظرية، كل شيء بسيط وجميل، ولكن في سياق المثال المقترح، ليس من الضروري حقًا؛ يمكننا أن نثق في الكمبيوتر لإضافة رقمين. نحن مهتمون أكثر بكيفية سير الأمور مع المشكلات الحقيقية التي يحلها طلاب JavaRush؛ على سبيل المثال، أقترح أخذ المستوى المحبوب 05.lesson12.bonus03.
/* مشكلة في الخوارزميات اكتب برنامجًا: 1. يدخل الرقم N > 0 من وحدة التحكم 2. ثم يدخل أرقام N من وحدة التحكم 3. يعرض الحد الأقصى للأرقام 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.
    • الإيجابيات: نحن لا نستخدم مكتبات الطرف الثالث.
    • السلبيات: المسار ليس للمبتدئين. التعقيد النسبي لتنفيذ الاختبار؛ قد يكون مقدار التعليمات البرمجية في الاختبار أكبر مما هو عليه في المهمة التي يتم اختبارها.
  3. استخدام مكتبات إضافية للاختبارات.
    • الإيجابيات: كود نظيف في الاختبارات، وسهولة نسبية في كتابة الاختبار. لم يتم تغيير كود المصدر للفئة قيد الاختبار.
    • السلبيات: تحتاج إلى ربط مكتبات الطرف الثالث بالمشروع.
لأكون صادقًا، أعجبني الخيار الثالث أكثر، فلنحاول تنفيذه.
قواعد النظام
قادني بحث قصير إلى الصفحة http://stefanbirkner.github.io/system-rules/ ، وأصبح من الواضح على الفور أن هذا هو ما أحتاجه.
مجموعة من قواعد JUnit لاختبار التعليمات البرمجية التي تستخدم java.lang.System.
لذلك، دعونا تحميل المكتبة . قم بتنزيل مكتبة Commons IO المطلوبة لكي تعمل قواعد النظام . نقوم بتوصيل كلا المكتبتين بمشروعنا (ملف -> هيكل المشروع -> المكتبات -> + -> Java) ونبدأ في النحت: بعد الإطلاق، تطلب منك مهمتنا إدخال أرقام 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