مستوى دخول اختبار جافا عبر الإنترنت اختبار البرنامج، JUnit. متطلبات اختبار جافا

أعتقد أن تطوير البرمجيات هو أكثر من مجرد وظيفة. أرى نفسي كحرفي يحاول أن يصبح أفضل كل يوم. الطريقة "الأسهل" للقيام بذلك هي العثور على بعض الأدوات الجيدة والإجابة على الأسئلة التالية:

  • متى يجب علي استخدام الأداة X؟
  • كيف يمكنني استخدام الأداة X؟

يعد الاختبار الآلي جزءًا مهمًا جدًا من تطوير البرمجيات، ولكن هناك القليل من المنشورات على مدونات المبرمجين حول الأدوات المستخدمة. ستسمح لك هذه المقالة نفسها بالاطلاع على "صندوق الأدوات" الخاص بي. سأغطي 12 مكتبة وإطار عمل أستخدمها لكتابة اختبارات الوحدات والتكامل، وأوفر روابط للصفحات التي ستساعدك على فهم كيفية استخدامها.

دعونا ننظر في صندوق الأدوات الخاص بي

قبل أن تتمكن من استخدام الأدوات الموضحة أدناه، يجب عليك إعداد إصدار يقوم تلقائيًا بتشغيل اختبارات التكامل والوحدة. عندي ملاحظتين حول هذا الموضوع:

  • يصف اختبار التكامل مع Maven كيف يمكننا إعداد بناء Maven باستخدام التكامل واختبارات الوحدة في أدلة مختلفة.
  • الشروع في العمل مع Gradle: اختبار التكامل مع البرنامج المساعد TestSets يغطي نفس الشيء بالنسبة لـ Gradle.

أنت الآن جاهز لإلقاء نظرة فاحصة على أدواتي. لقد قسمتها إلى فئات لتسهيل التنقل فيها.

لذا، إليك 12 أداة أستخدمها للتكامل واختبار الوحدات.

تشغيل الاختبارات

يوفر AssertJ واجهة برمجة تطبيقات مرنة لكتابة التأكيدات مع رسائل خطأ مفيدة، ويحسن إمكانية قراءة رمز الاختبار، ويسمح لك بتحويل الاختبارات إلى مواصفات قابلة للتنفيذ تلتزم باللغة المطلوبة الخاصة بالمجال.

بالإضافة إلى ذلك:

  • يغطي استخدام Hamcrest في الاختبار كيفية استخدام Hamcrest لكتابة الاختبارات، بالإضافة إلى كيفية توسيع قدراته باستخدام وحدات مخصصة.
  • يشرح تحويل التأكيدات إلى لغة خاصة بالمجال كيفية إنشاء تأكيدات مخصصة في AssertJ.
  • كتابة الاختبارات النظيفة: استبدال التأكيدات بلغة خاصة بالمجال. يشرح لماذا يجب علينا استبدال تأكيدات JUnit القياسية بتأكيداتنا التي تستخدم لغة مناسبة خاصة بالمجال.

اختبار رمز الوصول إلى البيانات

قاعدة بيانات سريعة، مفيدة لكتابة اختبارات التكامل التي يتم تشغيلها الجهاز المحليمطور.

امتداد لـ JUnit يمكن استخدامه لتهيئة قاعدة البيانات إلى حالة معروفة قبل تشغيل كل اختبار تكامل وملء قاعدة البيانات بالبيانات الضرورية. DbUnit له عيوبه، لكنه جدا اداة مفيدة، والذي يسمح لك بفصل بيانات الاختبار ورمز الاختبار.

بالإضافة إلى ذلك:

  • يصف المكونات الرئيسية لـ DbUnit التي تحتاج إلى معرفتها لكتابة الاختبارات باستخدام DbUnit.
  • يوفر خمس قواعد لكتابة أفضل الاختبارات لرمز الوصول إلى البيانات.

أثناء البحث عن مهام اختبار لمبرمجي Java، صادفت موقعًا مثيرًا للاهتمام (يجب ألا يذهب مستخدمو Avast، وتم اكتشاف برنامج نصي طروادة، ويبدو أن الآخرين بخير) - http://www.betterprogrammer.com. فهو يختبر مؤهلات مبرمجي جافا بأبسط طريقة، ولكن بطريقة تلقائية: عرض كتابة العديد من الوظائف (الطرق) ذات التعقيد المتزايد ونسخ الكود في TextArea. بعد ذلك، يقوم محرك الموقع بإجراء شيء ما مع المهام (ما لا يقل عن اختبار الوحدة)، ويحسب مؤشر تأهيل معين بناءً على معايير "جودة السرعة" ويعطي النتيجة النهائية بالشكل التالي:

ثم تبدأ الأسئلة. لقد قمت بنفسي بالبرمجة بلغة Java للمرة الثانية في حياتي (وبالتالي تخطيت المهام المعقدة ببساطة)، لذا فإن 82% في هذا الاختبار تتوافق مع المستوى مبرمج غير جافا. إذن، إلى أي مدى يجب على Java Junior وJava Programmer، وحتى أكثر من ذلك، توظيف Java Senior؟! ما النتيجة التي يمكن أن تتوقعها منها حاضرمبرمج جافا - 90، 95، 99؟ وأخيرًا، ماذا لو حصل "المبرمج" على أقل من 82، لكنه مع ذلك يتقدم لوظيفة ما؟!

الاختبار ليس دائمًا ممتعًا ومثيرًا للاهتمام. عادة ما تكون هذه العملية طويلة جدًا وفي بعض الأحيان مليئة بالعمل الرتيب. يبدو أن المبرمجين استخدموا مؤخرًا الإخراج القياسي أو مصحح الأخطاء لاختبار فئات جافا.

سأصف في هذه المقالة مكتبة JUnit 4، التي تعمل على تبسيط عملية كتابة الاختبارات وأتمتةها إلى حد كبير.

لتوضيح القدرات الرئيسية لإطار JUnit، دعونا نكتب فئة بدائية في Java ونسخر منها. سيكون لهذا الفصل طريقتان - إيجاد مضروب رقم غير سالب ومجموع رقمين. بالإضافة إلى ذلك، سيحتوي مثيل الفئة على عداد استدعاء الأسلوب.

فئة عامة MathFunc (مكالمات int؛ public int getCalls() ( مكالمات العودة؛) عامل طويل عام (رقم int) (calls++; if (number 1) ( for (int i = 1; i

الآن دعونا نكتب اختبارات الوحدة. للقيام بذلك، سوف نقوم بإنشاء فئة مع عدد من طرق الاختبار. وبطبيعة الحال، يمكن أن يحتوي الفصل أيضًا على طرق مساعدة عادية. لكي يتمكن عداء الاختبار من تحديد هويته، يجب إضافة تعليقات توضيحية إلى طرق الاختبار باستخدام @Test.

يمكن أن يحتوي التعليق التوضيحي على المعلمات التالية:

  • المتوقع - الإشارة إلى الاستثناء الذي سيتم إنشاؤه بواسطة الطريقة (انظر المثال أدناه)؛
  • المهلة - بعد أي وقت بالمللي ثانية سيتوقف الاختبار عن العمل ويعتبره غير ناجح.

إذا كنت تريد الإشارة إلى ضرورة تخطي اختبار معين، فقم بوضع علامة عليه باستخدام التعليق التوضيحيIgnore. على الرغم من أنه يمكنك ببساطة إزالة التعليق التوضيحيTest.

قد تكون هناك أوقات تحتاج فيها إلى بعض السياق، مثل مثيلات الفئة التي تم إنشاؤها مسبقًا، لتشغيل كل حالة اختبار. وبعد التنفيذ، تحتاج إلى تحرير الموارد المحجوزة. في هذه الحالة، ستحتاج إلى التعليقات التوضيحية @Before وAfter. سيتم تنفيذ الطريقة التي تحمل علامة @Before قبل كل حالة اختبار، وسيتم تنفيذ الطريقة التي تحمل علامة @After بعد كل حالة اختبار.

إذا كان يلزم إجراء التهيئة وإصدار الموارد مرة واحدة فقط - على التوالي، قبل وبعد جميع الاختبارات - فاستخدم زوجًا من التعليقات التوضيحية @BeforeClass و@AfterClass.

وهنا فئة الاختبار نفسها مع العديد من نصوص الاختبار:

فئة عامة MathFuncTest (رياضيات MathFunc خاصة؛ @Before public void init() ( math = new MathFunc();) @After public void TeaDown() ( math = null;) @Test public void call() (assertEquals(0, math .getCalls()); math.factorial(1); تأكيدEquals(1, math.getCalls()); math.factorial(1); تأكيدEquals(2, math.getCalls()); ) @Test public void Factorial() (تأكيدTrue(math.factorial(0) == 1);تأكيدTrue(math.factorial(1) == 1);تأكيدTrue(math.factorial(5) == 120);) @Test(المتوقع = IllegalArgumentException.class) عامل الفراغ العام Negative() ( math.factorial(-1); ) @Ignore @Test public void todo() (assertTrue(math.plus(1, 1) == 3); ) )

طريقة المكالمات تختبر صلاحية عداد المكالمات. تتحقق الطريقة المضروب مما إذا كان المضروب قد تم حسابه بشكل صحيح لبعض القيم القياسية. يتحقق الأسلوب FactorialNegative من أنه سيتم طرح IllegalArgumentException للقيم العاملية السالبة. سيتم تجاهل طريقة المهام. حاول إزالة التعليق التوضيحيIgnore عند تجربة الكود.

يتحقق الأسلوب AssurerTrue مما إذا كانت نتيجة التعبير صحيحة. بعض الطرق الأخرى التي قد تكون مفيدة:

  • تأكيد - النتيجة المتوقعة ومطابقة النتيجة المستلمة؛
  • تأكيد Null - نتيجة التعبير فارغة؛
  • تأكيدNotNull - نتيجة التعبير تختلف عن القيمة الفارغة؛
  • تأكيدSame - الكائنات المتوقعة والمستلمة هي نفس الكائن.
  • فشل - تولد الطريقة استثناء AssertionError - نضيفه إلى حيث لا ينبغي أن يتم تنفيذ البرنامج.

في لدينا العالم الحديثيمكن لـ IDEs العثور على الاختبارات وتشغيلها ببساطة في المشروع. ولكن ماذا لو كنت تريد تشغيلها يدويًا باستخدام رمز البرنامج. للقيام بذلك، يمكنك استخدام Runner.هناك إصدارات نصية - junit.textui.TestRunner، إصدارات رسومية - junit.swingui.TestRunner، junit.awtui.TestRunner.

ولكن أكثر من ذلك بقليل الطريقة الحديثةهو استخدام فئة JUnitCore. أضف الطريقة الرئيسية التالية إلى فئة MathFuncTest:

يلقي الفراغ الرئيسي العام الثابت (وسائط السلسلة) استثناءً (JUnitCore runner = new JUnitCore(); نتيجة النتيجة = runner.run(MathFuncTest.class); System.out.println("اختبارات التشغيل: " + result.getRunCount()); System.out.println("الاختبارات الفاشلة: " + result.getFailureCount()); System.out.println("الاختبارات التي تم تجاهلها: " + result.getIgnoreCount()); System.out.println("النجاح: " + النتيجة .كان ناجحا())؛ )

ونتيجة التنفيذ:

تشغيل الاختبارات: 3 اختبارات فاشلة: 0 اختبارات متجاهلة: 1 نجاح: صحيح

في المزيد الإصدارات السابقةمن أجل كتابة فئة اختبار JUnit، كان من الضروري إنشاء سليل junit.framework.TestCase. ثم كان من الضروري تحديد مُنشئ يأخذ سلسلة كمعلمة - اسم الطريقة - وتمريرها إلى الفئة الأصل. يجب أن تبدأ كل طريقة اختبار باختبار البادئة. تم استخدام طريقتي setUp وTearDown لتهيئة الموارد وتحريرها. باختصار رعب. حسنا، الآن كل شيء بسيط، نعم.

هذا كل شيء لهذا اليوم. أنا متأكد من أن JUnit Framework سيساعدك كثيرًا. التعليقات والأسئلة حول المقال هي موضع ترحيب.




قمة