[[Template core/front/global/updateWarning is throwing an error. This theme may be out of date. Run the support tool in the AdminCP to restore the default theme.]]
بالطبع فالTesting هو المرحلة قبل الأخيرة في دورة حياة تطوير البرنامج Software Development Life Cycle SDLC
و هي المرحلة التي تلي مرحلة الDevelopment مباشرة
ما أهميتها؟؟؟
أهميتها بديهية و هي تجنب أخطاء قد تحدث أثناء استخدام البرامج و التي قد تؤدي لخسائر ضخمة مثل أنظمة البنوك و ربما خسائر في الأرواح لو كان هذا البرنامج حيوى جداً مثل أنظمة الطائرات الملاحية و غيرها
و أهمية أخرى هي ضمان مستوى معين من جودة البرامج و توجد مقاييس عالمية مثل الCMMI و غيرها
هل المبرمج مطالب بتعلم الTesting ؟؟
الTesting في اطلاقه فرع كامل و كبير من فروع الSoftware و يقع تحت الQuality Assurance أو ضمان الجودة و يوجد له متخصصين مثل الTest Engineers و الQA Specialists و غيرهم
هل يعني هذا أنه لا فائدة من تعلمه بالنسبة للمبرمج؟؟؟
بالطبع معرفة المبادئ الأساسية في الTesting شئ أساسي و هذا لأنك في النهاية ستعمل جنباً بجنب مع Tesers و أحياناً في بعض الMethodologies مثل Scrum أو Extreme Programming قد تجلس أنت كDeveloper مع Tester على جهاز واحد لضمان اكتشاف الأخطاء أثناء كتابتها...
ماهو الجزء الذي يُهم المبرمج؟؟؟
الجزء الذي يُهم المبرمج و الذي يكون هو مُطالب بأداءه هو الUnit Testing و هو جزء صغير من الكود يقوم المبرمج بكتابته لعمل Testing لجزء اخر أكبر من الكود
و لنفهم ذلك تابع هذا المثال...
بفرض أنك تقوم بكتابة Class تقوم بعمليات حسابية جمع و طرح مثلاً
type MathOps = public class public class method &Add(x: System.Int32; y: System.Int32): System.Int32; class method Sub(x: System.Int32; y: System.Int32): System.Int32; end;
implementation
class method MathOps.&Add(x: System.Int32; y: System.Int32): System.Int32; begin exit x + y end;
class method MathOps.Sub(x: System.Int32; y: System.Int32): System.Int32; begin exit x - y end;
end.
و تريد أن تتأكد من صحة العمليات فماذا ستفعل؟؟؟
أغلبنا سيقوم بعمل Application بسيط (Console Application مثلاً) و يقوم باستخدام الClass و باعطاء قيم input و قراءة الoutputs و مقارنتها بالنتيجة الصحيحة المتوقعة Expected Result
هل هذه طريقة خطأ؟؟؟
لا بل ستؤدي المطلوب
ما عيوب هذه الطريقة؟؟؟
1- لا تصلح في المشاريع الضخمة التي تحتوي على عشرات الClasses و الMethods
2- كود الTesting منفصل تماماً عن الكود الحقيقي مما يجعل المشكلة الكبرى هي ربط كل class بالapplication الخاص بتجربتها و هذا يؤدي الى مشكلة تنظيمية أكبر
3-لا يمكنك عمل Testing للPrivate Classes بسهولة و هذا لأن الكود الخاص بالTesting منفصل
4- ستحتاج كل مرة لعمليتين Compile مرة للClasses الأساسية سواء كانت في dll منفصل او اي شئ اخر و مرة أخرى للTesting Application و هذا يُهدر وقت و مجهود
هل توجد طريقة أخرى؟؟؟
بالطبع و هي موضوع هذا المقال و هي الUnit Testing
مميزات الUnit Testing
1- تضمين كود الTesting داخل الUnit أو الDll التي تحتوي على الكود الأصلي و هذا يجعل الحل Modular بحيث لن تحتاج لحفظ الTesting Code منفصلاً عن الdll
2- سرعة أكثر في انجاز عملية الUnit Testing
اذن كيف يمكننا كتابة class تقوم بعمل testing للMathOps Class التي كتبناها منذ قليل
type [TestFixture()] TestClass = public class public
method TestClass.TestAdd; begin var &result: System.Int32 := MathOps.Add(10, 20); Assert.AreEqual(&result, 30) end;
method TestClass.TestSub; begin var &result: System.Int32 := MathOps.Sub(20, 10); Assert.AreEqual(&result, 10) end;
يمكنك اهمال الAttributes الموجودة للحظات سنتطرق لها بعد عدة سطور...
كما ترى أن الClass بسيطة فأنت تكتب فيها مجموعة من الFunctions تقوم بعملية Testing لFunction من الMathOps Class عن طريق اعطاءها قيم كمدخلات و مقارنة المخرجات مع القيم المتوقعة ثم عمل Assertion على أساس شرط معين و هنا الشرط هو أن تساوي القيم المتوقعة مع المخرجات
يمكن أن تكون عملية الTesting تقيس تعامل البرنامج مع الأخطاء فمثلاً في عملية القسمة تريد أن تتأكد أنه اذا كان المقسوم عليه يساوي صفر فان الFunction ستطلق ZeroDivisionException مثلاً و في هذه الحالة نعتبر الTestصحيحاً
ما هي الأدوات المستخدمة في الUnit Testing ؟؟؟؟
لكل لغة أو تكنولوجيا الأدوات الخاصة بها فمثلاً في الJava يوجد الJUnit و في الDotNet يوجد الNUnit و هو مجال حديثنا في الجزء الثاني من المقال
NUnit
هو مشروع مفتوح المصدر من أحد المشاريع الموجودة في www.sourceforge.net و هو مجاني و يدعم جميع لغات الDotNet سواء في الاصدارة 1 أو 1.1 أو 2.0
اولاً تحميل و تثبيت Nunit بسيط فقط حمل الNunit Installer من على الموقع و السابق ثم ثبته ببساطة
ثانياً ستقوم باضافة الdll التالية لمشاريعك التي تنوي عمل testing لها و هي nunit.framework.dll و ستجدها موجودة عندما تقوم بعمل Add Reference من داخل الVisual Studio
ثالثاً قم بعمل
plain text
using NUnit.Framework;
في الملف الذي تنوي أن تكتب فيه الTesting Class
رابعاً استخدم الAttributes التالية
TestFixture و يستخدم قبل الTesting Class
SetUp و يستخدم قبل الinitialization method و التي تستخدمها عادة لعمل أي initializations
Test و يستخدم قبل كل Test Method
Ignore و يستخدم لتجاهل Test Method معينة
يوجد العديد من الAttributes الأخرى يمكنك استكشافها بنفسك و لكن سنكتفي هنا بتجربة هذه الAttributes
type [TestFixture()] TestClass = public class public [SetUp()] method Init; [Test()] method TestAdd; [Test()] method TestSub; end; implementation method TestClass.Init; begin end; method TestClass.TestAdd; begin var &result: System.Int32 := MathOps.Add(10, 20); Assert.AreEqual(&result, 30) end;
method TestClass.TestSub; begin var &result: System.Int32 := MathOps.Sub(20, 10); Assert.AreEqual(&result, 10) end;
end.
و في الاخير انضر الى هدا الدرس الفيديوا كي تفهم اكثر
تم النشر منذ (معدل)
بسم الله الرحمن الرحيم
دروس من المنتدى
هل سمعت عن الTesting ؟؟؟؟
بالطبع فالTesting هو المرحلة قبل الأخيرة في دورة حياة تطوير البرنامج Software Development Life Cycle SDLC
و هي المرحلة التي تلي مرحلة الDevelopment مباشرة
ما أهميتها؟؟؟
أهميتها بديهية و هي تجنب أخطاء قد تحدث أثناء استخدام البرامج و التي قد تؤدي لخسائر ضخمة مثل أنظمة البنوك و ربما خسائر في الأرواح لو كان هذا البرنامج حيوى جداً مثل أنظمة الطائرات الملاحية و غيرها
و أهمية أخرى هي ضمان مستوى معين من جودة البرامج و توجد مقاييس عالمية مثل الCMMI و غيرها
هل المبرمج مطالب بتعلم الTesting ؟؟
الTesting في اطلاقه فرع كامل و كبير من فروع الSoftware و يقع تحت الQuality Assurance أو ضمان الجودة و يوجد له متخصصين مثل الTest Engineers و الQA Specialists و غيرهم
هل يعني هذا أنه لا فائدة من تعلمه بالنسبة للمبرمج؟؟؟
بالطبع معرفة المبادئ الأساسية في الTesting شئ أساسي و هذا لأنك في النهاية ستعمل جنباً بجنب مع Tesers و أحياناً في بعض الMethodologies مثل Scrum أو Extreme Programming قد تجلس أنت كDeveloper مع Tester على جهاز واحد لضمان اكتشاف الأخطاء أثناء كتابتها...
ماهو الجزء الذي يُهم المبرمج؟؟؟
الجزء الذي يُهم المبرمج و الذي يكون هو مُطالب بأداءه هو الUnit Testing و هو جزء صغير من الكود يقوم المبرمج بكتابته لعمل Testing لجزء اخر أكبر من الكود
و لنفهم ذلك تابع هذا المثال...
بفرض أنك تقوم بكتابة Class تقوم بعمليات حسابية جمع و طرح مثلاً
و تريد أن تتأكد من صحة العمليات فماذا ستفعل؟؟؟
أغلبنا سيقوم بعمل Application بسيط (Console Application مثلاً) و يقوم باستخدام الClass و باعطاء قيم input و قراءة الoutputs و مقارنتها بالنتيجة الصحيحة المتوقعة Expected Result
هل هذه طريقة خطأ؟؟؟
لا بل ستؤدي المطلوب
ما عيوب هذه الطريقة؟؟؟
1- لا تصلح في المشاريع الضخمة التي تحتوي على عشرات الClasses و الMethods
2- كود الTesting منفصل تماماً عن الكود الحقيقي مما يجعل المشكلة الكبرى هي ربط كل class بالapplication الخاص بتجربتها و هذا يؤدي الى مشكلة تنظيمية أكبر
3-لا يمكنك عمل Testing للPrivate Classes بسهولة و هذا لأن الكود الخاص بالTesting منفصل
4- ستحتاج كل مرة لعمليتين Compile مرة للClasses الأساسية سواء كانت في dll منفصل او اي شئ اخر و مرة أخرى للTesting Application و هذا يُهدر وقت و مجهود
هل توجد طريقة أخرى؟؟؟
بالطبع و هي موضوع هذا المقال و هي الUnit Testing
مميزات الUnit Testing
1- تضمين كود الTesting داخل الUnit أو الDll التي تحتوي على الكود الأصلي و هذا يجعل الحل Modular بحيث لن تحتاج لحفظ الTesting Code منفصلاً عن الdll
2- سرعة أكثر في انجاز عملية الUnit Testing
اذن كيف يمكننا كتابة class تقوم بعمل testing للMathOps Class التي كتبناها منذ قليل
يمكنك اهمال الAttributes الموجودة للحظات سنتطرق لها بعد عدة سطور...
كما ترى أن الClass بسيطة فأنت تكتب فيها مجموعة من الFunctions تقوم بعملية Testing لFunction من الMathOps Class عن طريق اعطاءها قيم كمدخلات و مقارنة المخرجات مع القيم المتوقعة ثم عمل Assertion على أساس شرط معين و هنا الشرط هو أن تساوي القيم المتوقعة مع المخرجات
يمكن أن تكون عملية الTesting تقيس تعامل البرنامج مع الأخطاء فمثلاً في عملية القسمة تريد أن تتأكد أنه اذا كان المقسوم عليه يساوي صفر فان الFunction ستطلق ZeroDivisionException مثلاً و في هذه الحالة نعتبر الTestصحيحاً
ما هي الأدوات المستخدمة في الUnit Testing ؟؟؟؟
لكل لغة أو تكنولوجيا الأدوات الخاصة بها فمثلاً في الJava يوجد الJUnit و في الDotNet يوجد الNUnit و هو مجال حديثنا في الجزء الثاني من المقال
NUnit
هو مشروع مفتوح المصدر من أحد المشاريع الموجودة في www.sourceforge.net و هو مجاني و يدعم جميع لغات الDotNet سواء في الاصدارة 1 أو 1.1 أو 2.0
و يمكنك تحميله من على http://www.nunit.com
كيف نستخدم Nunit
اولاً تحميل و تثبيت Nunit بسيط فقط حمل الNunit Installer من على الموقع و السابق ثم ثبته ببساطة
ثانياً ستقوم باضافة الdll التالية لمشاريعك التي تنوي عمل testing لها و هي nunit.framework.dll و ستجدها موجودة عندما تقوم بعمل Add Reference من داخل الVisual Studio
ثالثاً قم بعمل
plain text
using NUnit.Framework;
في الملف الذي تنوي أن تكتب فيه الTesting Class
رابعاً استخدم الAttributes التالية
TestFixture و يستخدم قبل الTesting Class
SetUp و يستخدم قبل الinitialization method و التي تستخدمها عادة لعمل أي initializations
Test و يستخدم قبل كل Test Method
Ignore و يستخدم لتجاهل Test Method معينة
يوجد العديد من الAttributes الأخرى يمكنك استكشافها بنفسك و لكن سنكتفي هنا بتجربة هذه الAttributes
و في الاخير انضر الى هدا الدرس الفيديوا كي تفهم اكثر
http://www.rongrove.com/Article/ViewArticle/38/nunit-setup-with-delphi-prism-in-visual-studio
كتاب
Pragmatic Unit Testing
in C# with NUnit, Second Edition
في المرفقات
شكرا
Pragmatic Unit Testing in C Sharp with NUnit.pdf
تم تعديل بواسطه زكيري عبد العاليشارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه