JavaRush /مدونة جافا /Random-AR /استراحة القهوة رقم 87. ما أهمية اختبار الوحدة للمطورين؟ 5...

استراحة القهوة رقم 87. ما أهمية اختبار الوحدة للمطورين؟ 5 طرق لنسخ مصفوفة في جافا

نشرت في المجموعة

ما أهمية اختبار الوحدة للمطورين؟

المصدر: SearchSoftwareQuality دعونا نناقش سبب أهمية وقيمة اختبار الوحدة، وكيف أنه يجعل تصحيح الأخطاء أسهل. يعد اختبار الوحدة أداة قوية لتحسين جودة البرامج. توفر اختبارات الوحدة التحقق الأساسي من أن التطبيق يتوافق مع مواصفات البرنامج ويتصرف على النحو المنشود. استراحة القهوة رقم 87.  ما أهمية اختبار الوحدة للمطورين؟  5 طرق لنسخ مصفوفة في جافا - 1عند القيام بذلك بشكل جيد، اختبارات الوحدة:
  • تقليل عدد العيوب وتحديدها في المراحل المبكرة من دورة حياة التطوير؛
  • تحسين إمكانية قراءة التعليمات البرمجية؛
  • السماح بإعادة استخدام التعليمات البرمجية؛
  • زيادة سرعة النشر.
دعونا نلقي نظرة على سبب أهمية اختبار الوحدة، وكيف نشأ هذا النوع من الاختبارات، وما هي العوائق التي تحول دون تنفيذه.

تاريخ اختبار الوحدة

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

مثال على اختبار الوحدة

يوضح هذا المثال أهمية اختبار الوحدة. هنا تقوم JUnit بتقييم وظيفة بسيطة تقوم بتحويل درجة الحرارة من فهرنهايت إلى درجة مئوية. صيغة التحويل: C = (F-32) * 5/9. يمكن تنفيذ بضعة أسطر فقط، بما في ذلك توقيع الوظيفة والأقواس المتعرجة، في التعليمات البرمجية كوظيفة مكتبة. ومع ذلك، ليس من الواضح من الوظيفة أن هذه معايير. قد تتضمن هذه الخيارات التقريب لأعلى أو لأسفل، أو الأرقام الحقيقية، أو الحدود العليا والدنيا. لنقم بإنشاء أمثلة لاختبارات الوحدة لوظيفة تحويل درجة الحرارة هذه في Perl باستخدام الوحدة النمطية Test::More. السطر الأول عبارة عن تعليق يخبر المبرمج بما يمكن توقعه من الكود المتبقي.
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
يعتمد إطار عمل JUnit على الأنظمة الموجهة للكائنات وكائنات الاختبار، ولكن المفهوم مشابه.

اختبارات الوحدات المعزولة

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

التكيف مع اختبارات الوحدة

البرنامج القديم هو برنامج تم تشغيله لفترة طويلة ومن المرجح أنه تمت كتابته بدون اختبارات الوحدة. الرمز القديم له قيمة بالنسبة للشركة. يعمل بثبات لسنوات عديدة. تقوم بعض البرامج المصممة بدون اختبارات الوحدة بمعالجة معاملات بملايين الدولارات يوميًا. لكن الكود الذي لا يحتوي على اختبارات وحدة يتحول إلى كرة كبيرة من الأوساخ بمرور الوقت لأنه تم لمسه من قبل العديد من مبرمجي صيانة الكود على مر السنين. تسمح إعادة البناء للمبرمجين بإجراء تغييرات تدريجية على النظام لجعله قابلاً للاختبار. ومع ذلك، فإن هذه التغييرات تستغرق وقتا. منذ عدة سنوات، ناقشت مع زميلي بوب ريسلمان مسألة استخدام اختبارات الوحدة للتطبيقات القديمة. قال ريسلمان إن تنفيذ اختبار الوحدة في التطبيقات المبنية بدونها أمر مكلف للغاية وحتى غبي. وبدلاً من ذلك، أوصى بأن تبدأ المنظمة تطويرًا جديدًا باختبارات الوحدة وترك التطبيقات القديمة بمفردها. قد يكون هذا صحيحًا بالنسبة لـ COBOL، ومولدات التقارير، والتطبيقات الأخرى، لكنني أزعم أنه في التطبيقات المكتوبة باللغات الحديثة -C++، وC#، وJava، وRuby - من السهل جدًا إضافة اختبارات الوحدة بأثر رجعي. بدلاً من كتابتها للتطبيق بأكمله، ما عليك سوى إضافة اختبارات الوحدة إلى التغيير الحالي وإعادة البناء أثناء التقدم.

زيادة السرعة والجودة وقابلية الاختبار

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

5 طرق لنسخ مصفوفة في جافا

المصدر: Dev.to إذن لديك مصفوفتان A وB وتحتاج إلى نسخ العناصر من A إلى B. حسنًا، هناك طرق مختلفة للقيام بذلك في Java وسأعرضها لك الآن.

الطريقة الأولى: ForLoop

هذا هو المكان الذي تأتي فيه حلقة for القديمة لمساعدتنا :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

الطريقة الثانية: .clone()

يمكن أن تساعد طريقة استنساخ المصفوفة أيضًا في تحقيق النتيجة المرجوة:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

الطريقة الثالثة: System.arraycopy()

الطريقة التالية هي استخدام الأسلوب System.arraycopy() الموجود في الحزمة java.lang . قبل أن ننتقل إلى استخدامه، دعونا نناقش توقيعه:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
طلب:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

الطريقة الرابعة: Arrays.copyOf()

خيار النسخ التالي الذي سنناقشه هو فئة Arrays من الحزمة java.utils . انتبه لتوقيعه:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
طلب:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

الطريقة الخامسة: Arrays.copyOfRange()

لذا، سيكون هذا هو الخيار الأخير الذي سننظر إليه في هذه المقالة. وهو أيضًا من فئة Arrays الموجودة في الحزمة java.utils . لننظر إلى توقيعه مرة أخرى:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
طلب:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION