هل أنت فضولي كيف يعمل اختبار الوحدة في الوحدة؟ غير متأكد ما وحدة الاختبار بشكل عام هو؟ إذا أجبت بشكل إيجابي على هذه الأسئلة ، فسيكون هذا البرنامج التعليمي مفيدًا لك. سوف تتعلم منه اختبار الوحدة:
- ما هذا
- مصلحتها
- مزايا وعيوب
- كيف يعمل في الوحدة باستخدام Test Runner
- كيفية كتابة وتنفيذ اختبارات الوحدة التي سيتم اختبارها
ملاحظة : يفترض هذا البرنامج التعليمي أنك معتاد على لغة C # وأساسيات التطوير في Unity. إذا كنت جديدًا على Unity ، فعليك التحقق من البرامج التعليمية الأخرى على هذا المحرك أولاً .
ما هو اختبار وحدة؟
قبل الخوض في الشفرة ، من المهم الحصول على فهم واضح لماهية اختبار الوحدة. ببساطة ، اختبار الوحدة هو اختبار ... الوحدات.
تم تصميم اختبار الوحدة (مثالي) لاختبار وحدة رمز منفصلة. قد يختلف تكوين "الوحدة" ، لكن من المهم أن تتذكر أن اختبار الوحدة يجب أن يختبر "عنصرًا" واحدًا تمامًا في وقت واحد.
يجب إنشاء اختبارات الوحدة للتحقق من أن جزءًا صغيرًا من الكود المنطقي في سيناريو معين يعمل تمامًا كما تتوقع. قد يكون هذا أمرًا صعب الفهم قبل البدء في كتابة اختبارات الوحدة الخاصة بك ، لذلك دعونا نلقي نظرة على مثال:
لقد كتبت طريقة تسمح للمستخدم بإدخال اسم. تتم كتابة الطريقة بحيث لا يُسمح بالأرقام في الاسم ، ويمكن أن يتكون الاسم نفسه من عشرة أحرف أو أقل فقط. تعترض طريقتك ضغط المفاتيح لكل مفتاح وتضيف الحرف المقابل إلى حقل
name
:
public string name = "" public void UpdateNameWithCharacter(char: character) {
ما يجري هنا:
- إذا لم يكن الحرف حرفًا ، فإن الرمز يخرج الوظيفة مسبقًا ولا يضيف الحرف إلى السلسلة.
- إذا كان الاسم يتكون من عشرة أحرف أو أكثر ، فإن الرمز لا يسمح للمستخدم بإضافة حرف آخر.
- إذا تم تمرير هذين الاختيارين ، يضيف الرمز حرفًا إلى نهاية الاسم.
يمكن اختبار هذه الوحدة ، لأنها "وحدة" للعمل المنجز. اختبارات وحدة
فرض منطق الأسلوب.
مثال على اختبار الوحدة
كيف نكتب اختبارات وحدة لأسلوب
UpdateNameWithCharacter
؟
قبل أن نبدأ في تنفيذ اختبارات الوحدات هذه ، نحتاج إلى التفكير بعناية في ما تفعله هذه الاختبارات والتوصل إلى أسماء لها.
ألقِ نظرة على أمثلة اسم اختبار الوحدة أدناه. يجب أن يكون واضحًا من الأسماء أنهم يتحققون من:
UpdateNameDoesntAllowCharacterAddingToNameIfNameIsTenOrMoreCharactersInLength
UpdateNameAllowsLettersToBeAddedToName
UpdateNameDoesntAllowNonLettersToBeAddedToName
من بين أسماء طرق الاختبار هذه ، نرى أننا نتحقق حقًا من أن "وحدة" العمل يتم
UpdateNameWithCharacter
بواسطة أسلوب
UpdateNameWithCharacter
. قد تبدو أسماء الاختبار هذه طويلة جدًا ومفصلة ، لكنها جيدة بالنسبة لنا.
كل اختبار وحدة تكتبه هو جزء من مجموعة من الاختبارات. تحتوي
مجموعة الاختبار على جميع اختبارات الوحدات المتعلقة بالمجموعة المنطقية الوظيفية (على سبيل المثال ، "اختبارات وحدة المعركة"). إذا فشل أي اختبار من المجموعة في الاختبار ، فسوف تفشل مجموعة الاختبار بأكملها.
لعبة إطلاق
افتح مشروع
Crashteroids Starter (يمكنك تنزيله
من هنا ) ، ثم افتح مشهد
اللعبة من مجلد
Assets / RW / Scenes .
انقر فوق "
تشغيل" لتشغيل Crashteroids ، ثم انقر فوق الزر "
بدء اللعبة" . حرك سفينة الفضاء بالسهم
الأيمن والأيسر على لوحة المفاتيح.
لإطلاق حزمة ليزر ، اضغط
مفتاح المسافة . إذا ضربت الحزمة الكويكب ، فستزيد النتيجة بمقدار واحد. إذا اصطدم كويكب بسفينة ، تنفجر السفينة وتنتهي اللعبة (مع إمكانية البدء من جديد).
حاول أن تلعب قليلاً وتأكد من ظهور نقش "لعبة انتهت" بعد تصادم الكويكب مع السفينة.
الشروع في العمل مع Unity Test Runner
الآن بعد أن عرفنا كيف تعمل اللعبة ، حان الوقت لكتابة اختبارات الوحدة للتحقق من أن كل شيء يعمل كما ينبغي. وبالتالي ، إذا قررت (أو أي شخص آخر) تحديث اللعبة ، فستكون متأكدًا من أن التحديث لن يكسر أي شيء نجح من قبل.
لكتابة الاختبارات ، عليك أولاً معرفة المزيد عن عداء اختبار الوحدة. يتيح لك
اختبار Runner إجراء الاختبارات والتحقق من نجاحها. لفتح Runner Test Runner ، حدد
Window ▸ General ▸ Test Runner .
بعد فتح Test Runner في نافذة جديدة ، يمكنك تبسيط حياتك من خلال النقر على نافذة Test Runner
وسحبها إلى المكان المجاور لنافذة Scene.
إعداد NUnit واختبار المجلدات
يُعد اختبار Runner ميزة اختبار وحدة يتم توفيرها بواسطة Unity ، لكنه يستخدم إطار عمل
NUnit . عندما تبدأ العمل مع اختبارات الوحدة بشكل أكثر جدية ، أوصي بدراسة
الويكي على NUnit لمعرفة المزيد. سيتم مناقشة كل ما تحتاجه للمرة الأولى في هذه المقالة.
لتشغيل الاختبارات ، نحتاج أولاً إلى إنشاء مجلد اختبار يتم تخزين فصول الاختبار فيه.
في نافذة
Project ، حدد مجلد
RW . ألقِ نظرة على نافذة
اختبار Runner وتأكد من تحديد
PlayMode .
انقر فوق الزر المسمى
Create PlayMode Test Assembly Folder . سترى مجلد جديد يظهر في مجلد RW. نحن راضون عن
اختبارات الاسم القياسية ، لذلك يمكنك فقط الضغط على
Enter .
قد تتساءل عن علامات التبويب المختلفة هذه داخل اختبار Runner.
يتم استخدام علامة تبويب
PlayMode للاختبارات التي يتم إجراؤها في وضع التشغيل (عندما تكون اللعبة قيد التشغيل في الوقت الفعلي).
يتم تشغيل الاختبارات في علامة التبويب
EditMode خارج وضع التشغيل ، وهو مناسب لاختبار أشياء مثل السلوكيات المخصصة في المفتش.
في هذا البرنامج التعليمي ، سوف نغطي اختبارات PlayMode. ولكن عندما تشعر بالراحة ، يمكنك تجربة التجربة في EditMode.
عند العمل مع Test Runner في هذا البرنامج التعليمي ، تأكد دائمًا من تحديد علامة تبويب PlayMode .
ما هو في جناح الاختبار؟
كما تعلمنا أعلاه ، فإن اختبار الوحدة عبارة عن وظيفة تختبر سلوك جزء معين من الشفرة. نظرًا لأن اختبار الوحدة هو طريقة لتشغيلها ، يجب أن يكون في ملف الفصل.
يتجاوز اختبار Runner جميع ملفات فئة الاختبار ويقوم بإجراء اختبارات وحدة منها. يسمى ملف الفصل الذي يحتوي على اختبارات وحدة مجموعة الاختبار.
في مجموعة الاختبار ، نقسم بشكل منطقي اختباراتنا. يجب علينا فصل رمز الاختبار إلى مجموعات منطقية منفصلة (على سبيل المثال ، مجموعة من الاختبارات للفيزياء ومجموعة منفصلة للمعركة). نحتاج في هذا البرنامج التعليمي إلى مجموعة واحدة فقط من الاختبارات ، وقد حان الوقت لإنشاء اختبار واحد.
إعداد مجموعة اختبار ومجموعة الاختبار
حدد مجلد
الاختبارات ، وفي نافذة
اختبار Runner ، انقر على زر
إنشاء اختبار في المجلد الحالي . اسم ملف
TestSuite الجديد.
بالإضافة إلى ملف C # الجديد ، يقوم مشغل Unity أيضًا بإنشاء ملف آخر يسمى
Tests.asmdef . هذا هو
ملف تعريف التجميع ، والذي يُستخدم لإظهار الوحدة حيث توجد تبعيات ملف الاختبار. يعد ذلك ضروريًا لأن رمز التطبيق النهائي موجود بشكل منفصل عن رمز الاختبار.
إذا كان لديك موقف لا تستطيع فيه Unity العثور على ملفات اختبار أو اختبارات ، فتأكد من وجود ملف تعريف تجميع يتضمن مجموعة الاختبار الخاصة بك. والخطوة التالية هي لتكوينه.
لكي يتمكن رمز الاختبار من الوصول إلى فصول اللعبة ، سننشئ مجموعة من رمز الفئة ونضع الرابط في مجموعة الاختبارات. انقر فوق مجلد
البرامج النصية لتحديده. انقر بزر الماوس الأيمن فوق هذا المجلد وحدد "
إنشاء تعريف التجميع" .
اسم الملف
GameAssembly .
انقر فوق مجلد
الاختبارات ، ثم ملف تعريف بناء
الاختبارات . في
المفتش ، انقر فوق زر
الإضافة تحت عنوان "
المراجع التجميعية التعريف" .
سترى حقل
المرجع المفقود . انقر على
النقطة المجاورة لهذا الحقل لفتح نافذة الاختيار. حدد ملف
GameAssembly .
يجب أن تشاهد ملف تجميع GameAssembly في قسم الارتباطات. انقر على زر
تطبيق لحفظ هذه التغييرات.
إذا لم تتبع هذه الخطوات ، فلن تتمكن من الرجوع إلى ملفات فئة اللعبة داخل ملفات اختبار الوحدة. بعد التعامل مع هذا ، يمكنك المتابعة إلى الرمز.
نكتب اختبار الوحدة الأولى
انقر نقرًا مزدوجًا فوق البرنامج النصي
TestSuite لفتحه في محرر التعليمات البرمجية. استبدل كل الكود بهذا:
using UnityEngine; using UnityEngine.TestTools; using NUnit.Framework; using System.Collections; public class TestSuite { }
ما الاختبارات التي نحتاجها للكتابة؟ بصراحة ، حتى في لعبة صغيرة مثل Crashteroids ، يمكنك كتابة عدد قليل من الاختبارات للتحقق من أن كل شيء يعمل كما ينبغي. في هذا البرنامج التعليمي ، نقصر أنفسنا على المجالات الرئيسية فقط: التعرف على التصادم وميكانيكا اللعبة الأساسية.
ملاحظة : عندما يتعلق الأمر بكتابة اختبارات وحدة المنتج على مستوى الإنتاج ، يجب أن تدفع ما يكفي من الوقت لتأخذ في الاعتبار جميع الحالات الحدودية التي يجب اختبارها في جميع مناطق الكود.
كاختبار أول ، من الجيد التحقق مما إذا كانت الكويكبات تتحرك فعليًا. سيكون من الصعب عليهم أن يصطدموا بالسفينة إذا ابتعدوا عنها! أضف الطريقة التالية والمتغير الخاص إلى البرنامج النصي
TestSuite :
private Game game;
لا يوجد سوى بضعة سطور من التعليمات البرمجية ، لكنها تفعل الكثير من الأشياء. لذلك دعونا نتوقف ونتعامل مع كل جزء:
- هذه سمة . تحدد السمات سلوكيات برنامج التحويل البرمجي المحددة. تخبر هذه السمة مترجم Unity أن الرمز هو اختبار وحدة. نتيجةً لذلك ، سوف يظهر في اختبار Runner عند بدء الاختبارات.
- إنشاء مثيل لعبة. كل شيء آخر مضمن في اللعبة ، لذلك عندما ننشئه ، سيتضمن كل شيء يحتاج إلى اختبار. في بيئة الإنتاج ، على الأرجح لن تكون جميع العناصر داخل نفس المباني الجاهزة. لذلك ، ستحتاج إلى إعادة إنشاء كل الكائنات اللازمة في المشهد.
- هنا نقوم بإنشاء كويكب حتى نتمكن من مراقبة ما إذا كان يتحرك. إرجاع الأسلوب
SpawnAsteroid
مثيل الكويكب الذي تم إنشاؤه. يحتوي مكون الكويكب على طريقة Move
(إذا كنت مهتمًا بكيفية عمل الحركة ، يمكنك إلقاء نظرة على البرنامج النصي للكويكب داخل RW / البرامج النصية ). - يعد تتبع موضع البداية ضروريًا للتأكد من أن الكويكب قد انخفض.
- جميع اختبارات وحدة Unity عبارة عن coroutines ، لذلك تحتاج إلى إضافة عائد ضعيف. نضيف أيضًا خطوة زمنية مدتها 0.1 ثانية لمحاكاة مرور الوقت الذي كان من المفترض أن يتحرك الكويكب فيه. إذا لم تكن بحاجة إلى محاكاة خطوة زمنية ، فيمكنك إرجاع قيمة خالية.
- هذه هي مرحلة التأكيد ، التي ندعي فيها أن موضع الكويكب أقل من الموضع الأولي (أي أنه قد انخفض). يُعد فهم التأكيدات جزءًا مهمًا من اختبار الوحدة ، وتوفر NUnit أساليب تأكيد مختلفة. يتم تحديد اجتياز الاختبار أو عدم اجتيازه من خلال هذا الخط.
- بالطبع ، لن يوبخك أحد بسبب الفوضى التي تركت بعد الانتهاء من الاختبارات ، ولكن قد تفشل اختبارات أخرى بسببها. من المهم دائمًا تنظيف الكود (حذفه أو إعادة ضبطه) بعد اختبار الوحدة ، بحيث عند إجراء اختبار الوحدة التالي ، لن يتبقى أي قطع أثرية يمكن أن تؤثر على هذا الاختبار. يكفي أن نقوم بحذف كائن اللعبة ببساطة ، لأن لكل اختبار نقوم بإنشاء مثيل جديد تمامًا للعبة.
اجتياز الاختبارات
حسنًا ، لقد كتبت اختبار الوحدة الأول الخاص بك ، ولكن كيف يمكنك معرفة ما إذا كان ذلك ناجحًا؟ بالطبع ، مع اختبار عداء! في نافذة Test Runner ، قم بتوسيع جميع الخطوط مع الأسهم. يجب أن تشاهد اختبار
AsteroidsMoveDown
في القائمة مع الدوائر الرمادية:
تشير الدائرة الرمادية إلى أن الاختبار لم يكتمل بعد. إذا كان الاختبار قد بدأ ونجح ، فسيظهر سهم أخضر بجانبه. إذا فشل الاختبار ، فسيتم عرض علامة X حمراء بجانبه ، ثم قم بإجراء الاختبار بالنقر فوق الزر
RunAll .
سيؤدي ذلك إلى إنشاء مشهد مؤقت وإجراء الاختبار. عند الانتهاء ، سترى أن الاختبار قد مر.
لقد نجحت في كتابة أول اختبار للوحدة يفيد بأن الكويكبات التي تم إنشاؤها تتجه لأسفل.
ملاحظة : قبل البدء في كتابة اختبارات الوحدة الخاصة بك ، تحتاج إلى فهم التنفيذ الذي تختبره. إذا كنت مهتمًا بكيفية عمل المنطق الذي تختبره ، فقم بدراسة الشفرة في مجلد RW / Scripts .
باستخدام اختبارات التكامل
قبل الانتقال بشكل أعمق إلى فتحة الأرنب في اختبارات الوحدة ، حان الوقت لمعرفة اختبارات التكامل وكيف تختلف عن اختبارات الوحدة.
اختبارات التكامل هي اختبارات تتحقق من كيفية عمل "الوحدات" في الكود معًا. "الوحدة النمطية" هو مصطلح غامض آخر. الفرق المهم هو أن اختبارات التكامل يجب أن تختبر تشغيل البرنامج في الإنتاج الحقيقي (أي عندما يلعب اللاعب حقًا لعبة).
دعنا نقول أنك صنعت لعبة معركة حيث قتل اللاعب الوحوش. يمكنك إنشاء اختبار تكامل للتأكد من أنه عندما يقتل اللاعب 100 عدو ، يتم فتح الإنجاز ("الإنجاز").
سيؤثر هذا الاختبار على العديد من وحدات الشفرة. على الأرجح ، سوف يتعلق الأمر بالمحرك المادي (التعرف على الاصطدام) ، ومرسلي العدو (تتبع صحة الأضرار ومعالجتها ، وكذلك الانتقال إلى الأحداث الأخرى ذات الصلة) ومتعقب الأحداث الذي يتعقب جميع الأحداث التي تم تشغيلها (على سبيل المثال ، "يتم قتل الوحش"). ثم ، عندما يحين وقت فتح الإنجاز ، يمكنه الاتصال بمدير الإنجاز.
سيحاكي اختبار التكامل اللاعب الذي يقتل 100 من الوحوش ويتحقق مما إذا كان الإنجاز مفتوحًا أم لا. إنه مختلف تمامًا عن اختبار الوحدة لأنه يختبر مكونات التعليمات البرمجية الكبيرة التي تعمل معًا.
في هذا البرنامج التعليمي ، لن ندرس اختبارات التكامل ، ولكن يجب أن يُظهر هذا الفرق بين وحدة العمل (ولماذا يتم اختبارها بشكل منفرد) ووحدة الشفرة (ولماذا يتم اختبارها بشكل متكامل).
إضافة اختبار إلى مجموعة اختبار
سيختبر الاختبار التالي نهاية اللعبة عندما تصطدم السفينة بكويكب. مع فتح
TestSuite في
محرر الكود ، أضف الاختبار الموضح أدناه أسفل اختبار الوحدة الأولى واحفظ الملف:
[UnityTest] public IEnumerator GameOverOccursOnAsteroidCollision() { GameObject gameGameObject = MonoBehaviour.Instantiate(Resources.Load<GameObject>("Prefabs/Game")); Game game = gameGameObject.GetComponent<Game>(); GameObject asteroid = game.GetSpawner().SpawnAsteroid();
لقد شاهدنا بالفعل معظم هذا الرمز في الاختبار السابق ، ولكن هناك بعض الاختلافات:
- نحن نجبر الكويكب والسفينة على الاصطدام ، مع إعطاء الكويكب بوضوح نفس وضع السفينة. سيؤدي هذا إلى خلق تصادم بين صناديق hitbox الخاصة بهم ويؤدي إلى نهاية اللعبة. إذا كنت مهتمًا بكيفية عمل هذا الرمز ، فقم بإلقاء نظرة على ملفات Ship و Game و Asteroid في مجلد Scripts.
- تعتبر الخطوة الزمنية ضرورية لإطلاق حدث التصادم الخاص بالمحرك المادي ، وبالتالي يتم إرجاع تأخير قدره 0.1 ثانية.
- هذه العبارة صحيحة ، وهي تتحقق من
gameOver
علامة gameOver
في البرنامج النصي Game. يصبح العلم صحيحًا أثناء تشغيل اللعبة ، عندما يتم تدمير السفينة ، وهذا هو ، ونحن اختبار للتأكد من أنه تم تعيينه إلى صحيح بعد تدمير السفينة.
ارجع إلى نافذة اختبار Runner وسترى أن اختبار وحدة جديد قد ظهر هناك.
هذه المرة سنقوم بتشغيل هذا واحد بدلاً من مجموعة الاختبار بالكامل. انقر فوق
GameOverOccursOnAsteroidCollision ، ثم انقر فوق الزر "
تشغيل المحدد" .
وفويلا ، اجتزنا اختبارًا آخر.
مراحل الضبط والدمار
ربما لاحظت أنه في اختبارينا يوجد رمز مكرر: حيث يتم إنشاء كائن اللعبة وحيث يتم تعيين رابط لسيناريو اللعبة:
GameObject gameGameObject = MonoBehaviour.Instantiate(Resources.Load<GameObject>("Prefabs/Game")); game = gameGameObject.GetComponent<Game>();
ستلاحظ أيضًا وجود تكرار في تدمير كائن اللعبة:
Object.Destroy(game.gameObject);
عند اختبار هذا يحدث في كثير من الأحيان. عندما يتعلق الأمر بإجراء اختبارات الوحدة ، هناك بالفعل مرحلتان: مرحلة
الإعداد ومرحلة
التمزيق .
سيتم تنفيذ كل التعليمات البرمجية داخل طريقة الإعداد قبل اختبار الوحدة (في هذه المجموعة) ، وسيتم تنفيذ جميع التعليمات البرمجية داخل طريقة Tear Down بعد اختبار الوحدة (في هذه المجموعة).
لقد حان الوقت لتبسيط حياتنا من خلال نقل الإعداد وهدم الكود إلى طرق خاصة. افتح محرر الكود وأضف الكود التالي في بداية ملف
TestSuite ، مباشرة قبل أول سمة [UnityTest]:
[SetUp] public void Setup() { GameObject gameGameObject = MonoBehaviour.Instantiate(Resources.Load<GameObject>("Prefabs/Game")); game = gameGameObject.GetComponent<Game>(); }
تشير سمة
SetUp
إلى أنه يتم استدعاء هذه الطريقة قبل
SetUp
كل اختبار.
ثم أضف الطريقة التالية واحفظ الملف:
[TearDown] public void Teardown() { Object.Destroy(game.gameObject); }
تشير السمة
TearDown
إلى أن هذه الطريقة تسمى بعد
TearDown
كل اختبار.
بعد إعداد رمز الإعداد والتدمير ، احذف سطور التعليمات البرمجية الموجودة في هذه الطرق واستبدلها بمكالمات للطرق المقابلة. بعد ذلك ، سيبدو الرمز كما يلي:
public class TestSuite { private Game game; [SetUp] public void Setup() { GameObject gameGameObject = MonoBehaviour.Instantiate(Resources.Load<GameObject>("Prefabs/Game")); game = gameGameObject.GetComponent<Game>(); } [TearDown] public void Teardown() { Object.Destroy(game.gameObject); } [UnityTest] public IEnumerator AsteroidsMoveDown() { GameObject asteroid = game.GetSpawner().SpawnAsteroid(); float initialYPos = asteroid.transform.position.y; yield return new WaitForSeconds(0.1f); Assert.Less(asteroid.transform.position.y, initialYPos); } [UnityTest] public IEnumerator GameOverOccursOnAsteroidCollision() { GameObject asteroid = game.GetSpawner().SpawnAsteroid(); asteroid.transform.position = game.GetShip().transform.position; yield return new WaitForSeconds(0.1f); Assert.True(game.isGameOver); } }
اختبار لعبة أكثر من والليزر اطلاق النار
بعد إعداد أساليب التوليف والتدمير التي تبسط حياتنا ، يمكننا البدء في إضافة اختبارات جديدة يتم استخدامها فيها. الاختبار التالي هو التحقق من أنه عندما ينقر اللاعب على
لعبة جديدة ، فإن قيمة
gameOver غير صحيحة. أضف مثل هذا الاختبار إلى نهاية الملف واحفظه:
[UnityTest] public IEnumerator NewGameRestartsGame() {
يجب أن يبدو هذا مألوفًا لك بالفعل ، ولكن ما يلي جدير بالذكر:
- يعد هذا الجزء من التعليمات البرمجية هذا الاختبار
gameOver
العلم المنطقي الخاص بـ gameOver
صحيحًا. عند استدعاء طريقة NewGame
، يجب عليها مرة أخرى تعيين العلامة على false
. - هنا نجادل بأن bool
isGameOver
غير false
، وهذا يجب أن يكون صحيحًا عند استدعاء لعبة جديدة.
ارجع إلى Test Runner وسترى أن هناك اختبارًا جديدًا
NewGameRestartsGame . قم بإجراء هذا الاختبار ، كما فعلنا من قبل ، وسوف ترى أنه يعمل بنجاح:
بيان شعاع الليزر
الاختبار التالي هو إضافة اختبار أن أشعة الليزر التي أطلقتها السفينة تطير لأعلى (على غرار اختبار الوحدة الأول الذي كتبناه). افتح ملف
TestSuite في المحرر. أضف الطريقة التالية واحفظ الملف:
[UnityTest] public IEnumerator LaserMovesUp() {
إليك ما يفعله هذا الرمز:
- الحصول على رابط لشعاع الليزر الذي تم إنشاؤه المنبعث من السفينة.
- يتم تسجيل موضع البدء حتى نتمكن من التحقق من صعوده.
- يتوافق هذا البيان مع البيان
AsteroidsMoveDown
اختبار وحدة AsteroidsMoveDown
، والآن فقط ندعي أن القيمة أكبر (أي ، يتحرك الليزر للأعلى).
Test Runner.
LaserMovesUp :
, , .
,
, .
TestSuite , :
[UnityTest] public IEnumerator LaserDestroysAsteroid() {
:
- , .
- . , UnityEngine.Assertions ? , Unity Null , «» Null. NUnit
Assert.IsNull()
Unity null. null Unity, UnityEngine.Assertions.Assert, Assert NUnit.
Test Runner . .
—
- — , . . ,
(Test Driven Development, TDD).
TDD, . , , , , . , , .
, . -, , .
: — , . , . «» , , . , . , . , , .
, - :
-
- , :
-
-. :
- , .
- .
- .
- , .
- , -.
- ( ), .
- - .
- UI .
- .
- .
,
. ,
TestSuite :
[UnityTest] public IEnumerator DestroyedAsteroidRaisesScore() {
, , , . :
- , . , .
- , game.score 1 ( 0, ).
Test Runner, , :
! .
إلى أين تذهب بعد ذلك؟
. ,
, .
, - Unity. , -, , -.
? . - . :
-,
mock- . .
NUnit , NUnit.
.
!