Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃNUnitΪÓÎÏ·ÏîÄ¿±àд¸ßÖÊÁ¿µ¥Ôª²âÊÔµÄ˼¿¼
 
À´Ô´£º¼òÊé ·¢²¼ÓÚ£º 2017-8-4
  2499  次浏览      28
 

0x00 µ¥Ôª²âÊÔPro & Con

×î½ü³¢ÊÔÔÚÎÒ²ÎÓëµÄÓÎÏ·ÏîÄ¿ÖÐÒýÈëTDD£¨²âÊÔÇý¶¯¿ª·¢£©µÄ¿ª·¢Ä£Ê½£¬Òò´Ëµ¥Ôª²âÊÔ±ã±äµÃÊ®·Ö±ØÒª¡£ÕâÆª²©¿Í¾ÍÀ´ÁÄÒ»ÁÄÕâ¶Îʱ¼äµÄ¸ÐÎòºÍÏë·¨¡£ÓÉÓÚÓÎÏ·¿ª·¢ºÍ´«Í³Èí¼þ¿ª·¢Ö®¼äµÄ²îÒ죬Òò´ËÔÚ¿ª·¢ÓÎÏ·£¬ÌرðÊÇʹÓÃUnity3D¿ª·¢ÓÎÏ·µÄ¹ý³ÌÖбàдµ¥Ôª²âÊÔÍùÍù»áÃæÁÙÁ½¸öÖ÷ÒªµÄÎÊÌ⣺

1.ÓÎÏ·¿ª·¢ÖлáÉæ¼°µ½ºÜ¶àµÄI/O²Ù×÷´¦Àí£¬ÒÔ¼°ÊÓ¾õºÍUIµÄ´¦Àí£¬¶øÕâ¸ö²¿·ÖÊǵ¥Ôª²âÊÔÖбȽÏÄÑÒÔ´¦ÀíµÄ²¿·Ö¡£

2.¾ßÌ嵽ʹÓÃUnity3D¿ª·¢ÓÎÏ·£¬ÎÒÃÇ×ÔÈ»¶øÈ»µÄÏ£ÍûÄܹ»½«²âÊԵĿò¼Ü¼¯³Éµ½Unity3DµÄ±à¼­Æ÷ÖУ¬ÕâÑù¸ü¼ÓÈÝÒײÙ×÷¡£

µ«ÊÇ£¬µ¥Ôª²âÊԵĺô¦Ò²Ê®·Ö¶à¡£

1.TDD£¬²âÊÔÇý¶¯¿ª·¢¡£±àдµ¥Ôª²âÊÔ½«Ê¹ÎÒÃÇ´Óµ÷ÓÃÕ߹۲졢˼¿¼¡£ÌرðÊÇÏÈд²âÊÔ£¬ÆÈʹÎÒÃǰѳÌÐòÉè¼Æ³ÉÒ×ÓÚµ÷ÓúͿɲâÊԵ쬼´ÆÈʹÎÒÃǽâ³ýÈí¼þÖеÄñîºÏ¡£¿ÉÒÔ½«ÈÎÎñµÄÁ£¶È½µµÍ¡£µ±È»TDDÊÇ·ñÊʺÏÓÎÏ·¿ª·¢ÉÐÓÐÕùÂÛ£¬µ«Êǵ¥Ôª²âÊԵıØÒªÐÔÊÇÎÞÐèÖÃÒɵġ£

2.µ¥Ôª²âÊÔÊÇÒ»ÖÖÎÞ¼ÛµÄÎĵµ£¬ËüÊÇչʾ·½·¨»òÀàÈçºÎʹÓõÄ×î¼ÑÎĵµ¡£Õâ·ÝÎĵµÊǿɱàÒë¡¢¿ÉÔËÐе쬲¢ÇÒËü±£³Ö×îУ¬ÓÀÔ¶Óë´úÂëͬ²½¡£

3.¸ü¼ÓÊʺÏÓ¦¶ÔÐèÇóµÄ¾­³£ÐÔ±ä¸ü¡£Éí´¦ÓÎÏ·¿ª·¢ÐÐÒµµÄ´ÓÒµÈËÔ±¶¼²»ÄÜ·ñÈϵÄÒ»µã±ãÊÇÓÎÏ·¿ª·¢ÖÐÐèÇó±ä¸üÊÇÒ»¼þ²»¿É±ÜÃâÉõÖÁÊDZز»¿ÉÉÙµÄÊÂÇ飬¶øµ¥Ôª²âÊÔÁíÒ»¸öºÃ´¦±ãÊÇÒ»µ©ÒòΪÐèÇó±ä¸ü¶ø³öÏÖbug£¬Äܹ»ºÜ¿ìµÄ·¢ÏÖ£¬½ø¶ø½â¾öÎÊÌâ¡£

0x01 Unity3DÖг£ÓõIJâÊÔ¹¤¾ß

Õë¶ÔÎÊÌâ1£¬ÓÉÓÚ¶ÔI/O´¦ÀíÒÔ¼°UIÊÓ¾õ·½ÃæµÄ²Ù×÷±È½ÏÄÑÒÔʵʩµ¥Ôª²âÊÔ£¬ËùÒÔÎÒÃǵ¥Ôª²âÊÔµÄÖ÷Òª¶ÔÏóÊÇÂß¼­²Ù×÷ÒÔ¼°Êý¾Ý´æÈ¡µÄ²¿·Ö¡£

Õë¶ÔÎÊÌâ2£¬Unity5.3.xÒѾ­ÔÚeditorÖм¯³ÉÁ˲âÊÔÄ£¿é¡£¸Ã²âÊÔÄ£¿éÒÀÍÐÁËNUnit¿ò¼Ü£¨NUnitÊÇÒ»¸öµ¥Ôª²âÊÔ¿ò¼Ü,רÃÅÕë¶ÔÓÚ.NETÀ´Ð´µÄ.ÆäʵÔÚÇ°ÃæÓÐJUnit(Java),CPPUnit(C++),ËûÃǶ¼ÊÇxUnitµÄÒ»Ô±.×î³õ,ËüÊÇ´ÓJUnit¶øÀ´.U3dʹÓõİ汾ÊÇ2.6.4£©¡£

ÔÚUnity EditorÖÐʵÏÖ²âÊÔ¶ø²»ÊÇÔÚIDEÖнøÐвâÊÔµÄÔ­ÒòÔÚÓÚ£¬Ò»Ð©UnityµÄAPIÐèÒªÔÚUnityµÄ»·¾³ÖÐÀ´ÔËÐУ¬¶øÎÞ·¨Ö±½ÓÔÚÍⲿµÄIDEÖÐʵÏÖ£¬ÀýÈçʵÀý»¯GameObject¡£

¶øÇÒ³ýÁËUnity5.3.x×Ô´øµÄµ¥Ôª²âÊÔÄ£¿éÖ®Í⣬Unity¹Ù·½»¹ÍƳöÁËÒ»¿î²âÊÔ²å¼þUnity Test Tool£¨»ùÓÚNSubstitute£©£¬³ýÁ˵¥Ôª²âÊÔÖ®Í⻹°üÀ¨£º

1.µ¥Ôª²âÊÔ

2.¼¯³É²âÊÔ

3.¶ÏÑÔ×é¼þ

ÐèÒªÖ¸³öµÄÊÇUnity Test Tool»ùÓÚNSubstituteÕâ¸ö¿â¡£

0x02 ³õʶµ¥Ôª²âÊÔ

¼ÈÈ»±¾ÎĵÄÖ÷ÌâÊǵ¥Ôª²âÊÔ£¬ÄÇôÎÒÃǾͱØÐëÏȶԵ¥Ôª²âÊÔÏÂÒ»¸ö¶¨Ò壺

Ò»¸öµ¥Ôª²âÊÔÊÇÒ»¶Î×Ô¶¯»¯µÄ´úÂ룬Õâ¶Î´úÂëµ÷Óñ»²âÊԵŤ×÷µ¥Ôª£¬Ö®ºó¶ÔÕâ¸öµ¥ÔªµÄµ¥¸ö×îÖÕ½á¹ûµÄijЩ¼ÙÉè½øÐмìÑé¡£µ¥Ôª²âÊÔʹÓõ¥Ôª²âÊÔ¿ò¼Ü±àд£¬²¢ÒªÇóµ¥Ôª²âÊÔ¿É¿¿¡¢¿É¶Á²¢ÇÒ¿Éά»¤¡£Ö»Òª²úÆ·´úÂë²»·¢Éú±ä»¯£¬µ¥Ôª²âÊԵĽá¹ûÊÇÎȶ¨µÄ¡£

¼ÈÈ»ÓÐÁ˵¥Ôª²âÊԵ͍Ò壬ÏÂÃæÎÒÃǾͳ¢ÊÔÔÚUnityÏîÄ¿ÖÐдµ¥Ôª²âÊÔ°É¡£

Ò»¸öµ¥Ôª²âÊÔµÄСÀý×Ó£º

±àдµ¥Ôª²âÊÔÓÃÀýʱ£¬Ê¹ÓõÄÖ÷ÒªÊÇUnity Editor×Ô´øµÄµ¥Ôª²âÊÔÄ£¿é£¬Òò´Ëµ¥Ôª²âÊÔÊÇ»ùÓÚNUnit¿ò¼ÜµÄ¡£

½èÖúNUnit£¬ÎÒÃÇ¿ÉÒÔ£º

1.±àд½á¹¹»¯µÄ²âÊÔ¡£

2.×Ô¶¯Ö´ÐÐÑ¡ÖеĻòÈ«²¿µÄµ¥Ôª²âÊÔ¡£

3.²é¿´²âÊÔÔËÐеĽá¹û¡£

Òò´ËÕâ¾ÍÒªÇó±àдUnity3DÏîÄ¿µÄµ¥Ôª²âÊÔʱ£¬ÒªÒýÈëNUnit.FrameworkÃüÃû¿Õ¼ä£¬ÇÒµ¥Ôª²âÊÔÀàÒª¼ÓÉÏ[TestFixture]ÊôÐÔ£¬µ¥Ôª²âÊÔ·½·¨Òª¼ÓÉÏ[Test]ÊôÐÔ£¬²¢½«²âÊÔÓÃÀýµÄÎļþ·ÅÔÚEditorÎļþ¼ÐÏ¡£

ÏÂÃæÊÇÒ»¸öÀý×Ó£º

using UnityEngine;
using System.Collections;
using NUnit.Framework;
[TestFixture]
public class HpCompTests
{
//²âÊÔ±»¹¥»÷Ö®ºóÉ˺¦ÊýÖµÊÇ·ñºÍÔ¤ÆÚÖµÏàµÈ
[Test]
public void TakeDamage_BeAttacked_HpEqual()
{
//Arrange
HpComp health = new HpComp();
health.currentHp = 100;
//Act
health.TakeDamage(50);
//Assert
Assert.AreEqual(50f, health.currentHp);
}
}

¸ÃÀý×ÓÊDzâÊÔÓ¢ÐÛÊܵ½É˺¦Ö®ºó£¬ÑªÁ¿ÊÇ·ñºÍÔ¤ÆÚµÄÏàµÈ¡£

²âÊÔ¿ò¼Ü»á´´½¨Õâ¸ö²âÊÔÓÃÀýÀ࣬²¢ÇÒµ÷ÓÃTakeDamage_BeAttacked_HpEqual·½·¨À´ºÍÆä½»»¥£¬×îºóʹÓÃNunitµÄAssertÀàÀ´¶ÏÑÔÊÇ·ñͨ¹ý²âÊÔ¡£

0x03 µ¥Ôª²âÊԵĽṹ

ͨ¹ýÉÏÃæµÄСÀý×Ó£¬ÎÒÃÇ¿ÉÒÔ·¢ÏÖµ¥Ôª²âÊÔÆäʵÊÇÓнṹµÄ¡£ÏÂÃæÎÒÃǾÍÀ´¾ßÌå·ÖÎöһϣº

ʹÓÃNUnitÌṩµÄÌØÐÔÀ´±êʶ²âÊÔ´úÂë

NUnitʹÓÃC#µÄÌØÐÔ»úÖÆÊ¶±ðºÍ¼ÓÔØ²âÊÔ¡£ÕâÐ©ÌØÐÔ¾ÍÏñÊÇÊéÇ©£¬ÓÃÀ´°ïÖú²âÊÔ¿ò¼Üʶ±ðÄÄЩ²¿·ÖÊÇÐèÒªµ÷ÓõIJâÊÔ¡£

Èç¹ûҪʹÓÃNUnitµÄÌØÐÔ£¬ÎÒÃÇÐèÒªÔÚ²âÊÔ´úÂëÖÐÊ×ÏÈÒýÈëNUnit.FrameworkÃüÃû¿Õ¼ä¡£

¶øNUnitÔËÐÐÆ÷ÖÁÉÙÐèÒªÁ½¸öÌØÐÔ²ÅÖªµÀÐèÒªÔËÐÐʲô¡£

1.[TestFixture]£º±êʶһ¸ö×Ô¶¯»¯NUnit²âÊÔµÄÀà¡£

2.[Test]£º¿ÉÒÔ¼ÓÔÚÒ»¸ö·½·¨ÉÏ£¬±êʶÕâ¸ö·½·¨ÊÇÒ»¸öÐèÒªµ÷ÓõÄ×Ô¶¯»¯²âÊÔ¡£

µ±È»£¬»¹ÓÐһЩ±ðµÄÌØÐÔ¹©ÎÒÃÇʹÓã¬À´·½±ãÎÒÃǸüºÃµÄ¿ØÖƲâÊÔ´úÂ룬ÀýÈç[Category]ÌØÐÔ¿ÉÒÔ½«²âÊÔ·ÖÀà¡¢[Ignore]ÌØÐÔ¿ÉÒÔºöÂÔ²âÊÔ¡£

³£ÓõÄNUnitÊôÐÔ¼ûÏÂ±í£º

[SetUp]
[TearDown]
[TestFixture]
[Test]
[TestCase]
[Category]
[Ignore]

²âÊÔÃüÃûºÍ²¼¾Ö±ê×¼

²âÊÔÀàµÄÃüÃû£º

¶ÔÓ¦±»²âÊÔÏîÄ¿ÖеÄÒ»¸öÀ࣬´´½¨Ò»¸öÃûΪ[ClassName]TestsµÄÀà¡£

¹¤×÷µ¥ÔªµÄÃüÃû£º

¶Ôÿ¸ö¹¤×÷µ¥Ôª£¨²âÊÔ£©£¬²âÊÔ·½·¨µÄ·½·¨ÃûÓÉÈý²¿·Ö×é³É£¬²¢ÇÒ°´ÕÕÈçϹæÔòÃüÃû£º[±»²âÊԵķ½·¨Ãû]_[²âÊÔ½øÐеļÙÉèÌõ¼þ]_[¶Ô²âÊÔ·½·¨µÄÔ¤ÆÚ]¡£

¾ßÌåÀ´Ëµ£º

1.±»²âÊԵķ½·¨Ãû

2.²âÊÔ½øÐеļÙÉèÌõ¼þ£¬ÀýÈç¡°µÇÈëʧ°Ü¡±¡¢¡°ÎÞЧÓû§¡±¡¢¡°ÃÜÂëÕýÈ·¡±¡£

3.¶Ô²âÊÔ·½·¨µÄÔ¤ÆÚ£ºÔÚ²âÊÔ³¡¾°Ö¸¶¨µÄÌõ¼þÏ£¬ÎÒÃǶԱ»²âÊÔ·½·¨µÄÐÐΪµÄÔ¤ÆÚ¡£

ÆäÖУ¬¶Ô²âÊÔ·½·¨µÄÔ¤ÆÚ»áÓÐÈýÖÖ¿ÉÄܵĽá¹û£º

1.·µ»ØÒ»¸öÖµ£¨ÊýÖµ¡¢²¼¶ûÖµµÈµÈ£©¡£

2.¸Ä±ä±»²âÊÔµÄϵͳµÄÒ»¸ö״̬¡£

3.µ÷ÓÃÒ»¸öµÚÈý·½ÏµÍ³¡£

¿ÉÒÔ¿´³ö£¬ÎÒÃǵIJâÊÔ´úÂëÔÚ¸ñʽÉÏÓë±ê×¼µÄ´úÂëÓÐËù²»Í¬£¬²âÊÔÃû¿ÉÒԺܳ¤£¬µ«ÊÇÔÚ±àд²âÊÔ´úÂëʱ£¬¿É¶ÁÐÔÊÇ×îÎªÖØÒªµÄ·½ÃæÖ®Ò»£¬¶ø²âÊÔÃûÖеÄÏ»®Ïß¿ÉÒÔÁîÎÒÃDz»»áÒÅ©ËùÓеÄÖØÒªÐÅÏ¢£¬ÎÒÃÇÉõÖÁ¿ÉÒÔ½«²âÊÔ·½·¨Ãûµ±×öÒ»¸ö¾ä×ÓÀ´¶Á£¬ÕâÑù¾Í»áʹµÃÕâ¸ö²âÊÔ·½·¨µÄ²âÊÔÄ¿±ê¡¢³¡¾°ÒÔ¼°Ô¤ÆÚ¶¼Ê®·ÖÃ÷È·£¬ÎÞÐè¶îÍâµÄ×¢ÊÍ¡£

²âÊÔµ¥ÔªµÄÐÐΪ¡ª¡ª3AÔ­Ôò

ÓÐÁËNUnitÊôÐÔ¿ÉÒÔ±êʶ¿ÉÒÔ×Ô¶¯ÔËÐеIJâÊÔ´úÂëºÍ²âÊÔ´úÂëµÄһЩÃüÃû¹æÔò£¬ÏÂÃæÎÒÃǾÍÀ´¿´¿´ÈçºÎ²âÊÔ×Ô¼ºµÄ´úÂë¡£

Ò»¸öµ¥Ôª²âÊÔͨ³£°üº¬Èý¸öÐÐΪ£¬¿ÉÒÔ¹éÄÉΪ3AÔ­Ôò¼´£º

1.Arrange£¬×¼±¸¶ÔÏ󣬴´½¨¶ÔÏó²¢½øÐбØÒªµÄÉèÖá£

2.Act£¬²Ù×÷¶ÔÏó¡£

3.Assert£¬¶ÏÑÔij¼þÊÂÇéÊÇÔ¤ÆÚµÄ¡£

ÏÂÃæÊÇ֮ǰµÄÄǶμòµ¥µÄ´úÂ룬°üº¬ÁËÒÔÉϵÄNUnitµÄÊôÐÔ¡¢ÃüÃû¹æ·¶ÒÔ¼°3AÔ­ÔòϵÄÐÐΪ£¬ÆäÖжÏÑÔ²¿·ÖʹÓÃÁËNUnit¿ò¼ÜÌṩµÄAssertÀ࣬±»²âÊÔµÄÀàΪHpComp£¬±»²âÊԵķ½·¨ÎªTakeDamage¡£

using NUnit.Framework;
[TestFixture]
public class HpCompTests
{
//²âÊÔ±»¹¥»÷Ö®ºóÉ˺¦ÊýÖµÊÇ·ñºÍÔ¤ÆÚÖµÏàµÈ
[Test]
public void TakeDamage_BeAttacked_HpEqual()
{
//Arrange
HpComp health = new HpComp();
health.currentHp = 100;
//Act
health.TakeDamage(50);
//Assert
Assert.AreEqual(50f, health.currentHp);
}
}

µ¥Ôª²âÊԵĶÏÑÔ¡ª¡ªAssertÀà

NUnit¿ò¼ÜÌṩÁËÒ»¸öAssertÀàÀ´´¦Àí¶ÏÑÔµÄÏà¹Ø¹¦ÄÜ¡£AssetÀàÓÃÓÚÉùÃ÷ij¸öÌØ¶¨µÄ¼ÙÉèÓ¦¸Ã³ÉÁ¢£¬Òò´ËÈç¹û´«µÝ¸øAssertÀàµÄ²ÎÊýºÍÎÒÃǶÏÑÔ£¨Ô¤ÆÚ£©µÄÖµ²»Í¬£¬ÔòNUnit¿ò¼Ü»áÈÏΪ²âÊÔûÓÐͨ¹ý¡£

AssertÀà»áÌṩһЩ¾²Ì¬·½·¨£¬¹©ÎÒÃÇʹÓá£

ÀýÈ磺

Assert.AreEqual(Ô¤ÆÚÖµ£¬Êµ¼ÊÖµ)£»
Assert.AreEqual(1£¬2 - 1)£»

¹ØÓÚAssertÀàµÄ¾²Ì¬·½·¨£¬¸÷λ¿ÉÒÔÖ±½ÓÔÚ´úÂëÖп´¡£

0x04 µ¥Ôª²âÊԵĿɿ¿ÐÔ

ÎÒÃǵÄÄ¿±êÊÇд³ö¿É¿¿¡¢¿Éά»¤¡¢¿É¶ÁµÄ²âÊÔ¡£

Òò´Ë£¬³ýÁË×ñÑ­µ¥Ôª²âÊԽṹ¹æ·¶±àдµ¥Ôª²âÊÔÖ®Í⣬ÎÒÃÇ»¹ÐèҪעÒâ¿É¿¿ÐÔ¡¢¿Éά»¤ÐÔÒÔ¼°¿É¶ÁÐÔÕâЩ·½Ãæ¡£Òò´Ë£¬Ò»Ð©Ô­ÔòÎÒÃÇÒ²ÐèҪעÒâ¡£

²»ÇáÒ×ɾ³ýºÍÐ޸IJâÊÔ

Ò»µ©²âÊÔдºÃÁ˲¢ÇÒͨ¹ýÁË£¬¾Í²»Ó¦¸ÃÇáÒ×µÄÐ޸ĺÍɾ³ýÕâЩ²âÊÔ¡£ÒòΪÕâЩ²âÊÔÊǶÔӦϵͳ´úÂëµÄ±£»¤É¡£¬ÔÚÐÞ¸Äϵͳ´úÂëʱ£¬ÕâЩ²âÊÔ»á¸æËßÎÒÃÇÐ޸ĺóµÄ´úÂëÊÇ·ñ»áÆÆ»µÒÑÓеŦÄÜ¡£

¾¡Á¿±ÜÃâ²âÊÔÖеÄÂß¼­

Ëæ×ŲâÊÔÖеÄÂß¼­Ôö¶à£¬²âÊÔ´úÂë³öÏÖȱÏݵļ¸ÂÊÒ²»áÔö´ó¡£¶øÇÒÓÉÓÚÎÒÃÇÍùÍùÏàÐŲâÊÔÊǿɿ¿µÄ£¬Òò´ËÒ»µ©²âÊÔ³öÏÖȱÏÝÎÒÃÇÍùÍù²»»áÊ×ÏÈ¿¼ÂÇÊDzâÊÔµÄÎÊÌ⣬¿ÉÄÜ»áÀË·Ñʱ¼äÈ¥ÐÞ¸Äϵͳ´úÂë¡£¶øµ¥Ôª²âÊÔÖУ¬×îºÃ±£³ÖÂß¼­µÄ¼òµ¥£¬Òò´Ë¾¡Á¿±ÜÃâʹÓÃÏÂÃæµÄÂß¼­¿ØÖÆ´úÂë¡£

1.switch¡¢if

2.foreach¡¢for¡¢while

Ò»¸öµ¥Ôª²âÊÔÓ¦¸ÃÊÇһϵÁеķ½·¨µ÷ÓúͶÏÑÔ£¬µ«ÊDz»Ó¦¸Ã°üº¬¿ØÖÆÁ÷Óï¾ä¡£

Ö»²âÊÔÒ»¸ö¹Ø×¢µã

ÔÚÒ»¸öµ¥Ôª²âÊÔÖÐÑéÖ¤¶à¸ö¹Ø×¢µã»áʹµÃ²âÊÔ´úÂë±äµÃ¸´ÔÓ£¬µ«È´Ã»ÓмÛÖµ¡£Ïà·´£¬ÎÒÃÇÓ¦¸ÃÔÚ·Ö¿ªµÄ¡¢¶ÀÁ¢µÄµ¥ÔªÖÐÑéÖ¤¶àÓàµÄ¹Ø×¢µã£¬ÕâÑù²ÅÄÜ·¢ÏÖÕæÕýµ¼ÖÂʧ°ÜµÄµØ·½¡£

0x05 µ¥Ôª²âÊԵĿÉά»¤ÐÔ

È¥³ýÖØ¸´´úÂë

ºÍϵͳÖеÄÖØ¸´´úÂëÒ»Ñù£¬ÔÚµ¥Ôª²âÊÔÖÐÖØ¸´´úÂëͬÑùÒâζ×ŲâÊÔ¶ÔÏóij·½Ãæ¸Ä±äʱҪÐ޸ĸü¶àµÄ²âÊÔ´úÂë¡£

Èç¹û²âÊÔ¿´ÉÏÈ¥¶¼Ò»Ñù£¬½ö½öÊDzÎÊý²»Í¬£¬ÄÇôÎÒÃÇÍêÈ«¿ÉÒÔʹÓòÎÊý»¯²âÊÔ¼´Ê¹ÓÃ[TestCase]ÌØÐÔ½«²»Í¬µÄÊý¾Ý×÷Ϊ²ÎÊý´«Èë²âÊÔ·½·¨¡£

ʵʩ²âÊÔ¸ôÀë

ËùνµÄ²âÊÔ¸ôÀ룬ָµÄÊÇÒ»¸ö²âÊÔºÍÆäËûµÄ²âÊÔ¸ôÀ룬ÉõÖÁ²»ÖªµÀÆäËû²âÊԵĴæÔÚ£¬¶øÖ»ÔÚ×Ô¼ºµÄСÊÀ½çÖÐÔËÐС£

½«²âÊÔ¸ôÀëµÄÄ¿µÄÊÇ·ÀÖ¹²âÊÔÖ®¼äµÄ»¥ÏàÓ°Ï죬³£¼ûµÄ²âÊÔÖ®¼ä»¥ÏàÓ°ÏìµÄÇé¿ö¿ÉÒÔ×ܽáÈçÏ£º

1.Ç¿ÖÆµÄ²âÊÔ˳Ðò£º²âÊÔÒªÒÔijÖÖ˳ÐòÖ´ÐУ¬ºóÒ»¸ö²âÊÔÐè񻂡̾µÄ²âÊÔ½á¹û£¬ÕâÖÖÇé¿öÓпÉÄܻᵼÖÂÎÊÌâµÄÔ­ÒòÊÇÒòΪNUnit²»Äܱ£Ö¤²âÊÔ°´ÕÕijÖÖÌØ¶¨µÄ˳ÐòÖ´ÐУ¬Òò´Ë½ñÌìͨ¹ýµÄ²âÊÔ£¬Ã÷Ìì¿ÉÄܾͲ»ºÃÓÃÁË

2.Òþ²ØµÄ²âÊÔµ÷Ó㺲âÊÔµ÷ÓÃÆäËû²âÊÔ

3.¹²Ïí״̬±»ÆÆ»µ£º²âÊÔÒª¹²Ïí״̬£¬µ«ÊÇÔÚÒ»¸ö²âÊÔÍê³ÉÖ®ºóûÓÐÖØÖÃ״̬£¬½ø¶øÓ°ÏìºóÃæµÄ²âÊÔ

0x06 µ¥Ôª²âÊԵĿɶÁÐÔ

ÕýÈç¸ÅÊöÖÐËù˵µ¥Ôª²âÊÔÊÇÒ»ÖÖÎÞ¼ÛµÄÎĵµ£¬ËüÊÇչʾ·½·¨»òÀàÈçºÎʹÓõÄ×î¼ÑÎĵµ¡£Òò´Ë£¬¿É¶ÁÐÔÕâÌõÒªÇóµÄÖØÒªÐÔ±ã¿É¼ûÒ»°ß¡£ÊÔÏëһϼ´±ãÊǼ¸¸öÔÂÖ®ºó±ðµÄ³ÌÐòÔ±¶¼¿ÉÒÔͨ¹ýµ¥Ôª²âÊÔÀ´Àí½âÒ»¸öϵͳµÄ×é³ÉÒÔ¼°Ê¹Ó÷½·¨£¬²¢Äܹ»ºÜ¿ìµÄÀí½âËûÃÇÒª×öµÄ¹¤×÷ÒÔ¼°ÔÚÄÄÀïÇÐÈë¡£

µ¥Ôª²âÊÔÃüÃû

ÔÚµ¥Ôª²âÊԵĽṹÖÐÒѾ­ÓйýÒªÇóºÍ½éÉÜ¡£²Î¿¼ÄDz¿·Ö¡£

µ¥Ôª²âÊÔÖеıäÁ¿ÃüÃû

ͨ¹ýºÏÀíµÄÃüÃû±äÁ¿£¬¿ÉÒÔÌá¸ß¿É¶ÁÐÔ£¬Ê¹µÃÔĶÁ²âÊÔµÄÈËÔ±¿ÉÒÔ¾¡¿ìµÄÀí½âÄãÒªÑéÖ¤µÄÄÚÈÝ¡£

»¹ÊÇ¿´¿´ÉÏÃæµÄÀý×Ó

[Test]
public void TakeDamage_BeAttacked_HpEqual()
{
//Arrange
HpComp health = new HpComp();
health.currentHp = 100;
//Act
health.TakeDamage(50);
//Assert
Assert.AreEqual(50f, health.currentHp);
}

Õâ¶Î´úÂëÖеĶÏÑÔʹÓÃÁËÒ»¸öħÊý50£¬µ«ÊÇÕâ¸öÊý×Ö²¢Ã»ÓÐʹÓÃÃèÊöÐÔµÄÃû×Ö£¬Òò´ËÎÒÃÇÎÞ·¨¾¡¿ìµÄÖªµÀÕâ¸öÊý×ÖÔ¤ÆÚµÄÊÇʲô¡£Òò´Ë£¬ÎÒÃǾ¡¿ÉÄܲ»ÒªÖ±½ÓʹÓÃÊý×ֺͽá¹û±È½Ï£¬¶øÊÇʹÓÃÒ»¸öÓÐÒâÒåÃüÃûµÄ±äÁ¿À´ºÍ½á¹û½øÐбȽϡ£

[Test]
public void TakeDamage_BeAttacked_HpEqual()
{
HpComp health = new HpComp();
health.currentHp = 100;
health.TakeDamage(50);
float leftHp = 50f;
Assert.AreEqual(leftHp, health.currentHp);
}

0x07 ÔÚUntiy±à¼­Æ÷ÖÐдµ¥Ôª²âÊÔ

ÔÚUnity±à¼­Æ÷Öбàдµ¥Ôª²âÊÔÓÃÀýʱ£¬Ê¹ÓõÄÖ÷ÒªÊÇUnity±à¼­Æ÷×Ô´øµÄµ¥Ôª²âÊÔÄ£¿é£¬Òò´Ëµ¥Ôª²âÊÔÊÇ»ùÓÚNUnit¿ò¼ÜµÄ¡£

Õâ¾ÍÒªÇó±àдµ¥Ôª²âÊÔʱ£¬ÒªÒýÈëNUnit.FrameworkÃüÃû¿Õ¼ä£¬ÇÒµ¥Ôª²âÊÔÀàÒª¼ÓÉÏ[TestFixture]ÊôÐÔ£¬µ¥Ôª²âÊÔ·½·¨Òª¼ÓÉÏ[Test]ÊôÐÔ£¬²¢½«²âÊÔÓÃÀýµÄÎļþ·ÅÔÚEditorÎļþ¼ÐÏ¡£

²âÊÔÓÃÀýµÄ±àд½á¹¹Òª×ñÑ­3AÔ­Ôò£¬¼´Arrange, Act, Assert¡£

¼´ÏÈÒªÉèÖòâÊÔ»·¾³£¬ÀýÈçʵÀý»¯²âÊÔÀ࣬Ϊ²âÊÔÀàµÄ×ֶθ³Öµ¡£

Ö®ºóд²âÊÔµÄÐÐΪ¡£

×îºóÊÇÅжÏÊÇ·ñͨ¹ý²âÊÔ¡£

ÏÂÃæÊÇÒ»¸öÀý×Ó£º

using UnityEngine;
using System.Collections;
using NUnit.Framework;
[TestFixture]
public class HealthComponentTests
{
//²âÊÔÉ˺¦Ö®ºó£¬ÑªµÄÖµÊÇ·ñ±È0´ó
[Test]
public void TakeDamage_BeAttacked_BiggerZero()
{
//Arrange
UnMonoHealthClass health = new UnMonoHealthClass();
health.healthAmount = 50f;
//Act
health.TakeDamage(60f);
//Assert
Assert.GreaterOrEqual(health.healthAmount, 0);
}
}

¸ÃÀý×ÓÊDzâÊÔÓ¢ÐÛÊܵ½É˺¦Ö®ºó£¬ÑªÁ¿ÊÇ·ñ»áÔ½½ç³öÏÖ¸ºÖµ¡£

²âÊÔ¿ò¼Ü»á´´½¨Õâ¸ö²âÊÔÓÃÀýÀ࣬²¢ÇÒµ÷ÓÃTakeDamage_BeAttacked_BiggerZero·½·¨À´ºÍÆä½»»¥£¬×îºóʹÓÃNunitµÄAssertÀàÀ´¶ÏÑÔÊÇ·ñͨ¹ý²âÊÔ¡£

ʹÓÃEditor Tests Runner¿ªÊ¼µ¥Ôª²âÊÔ£º

дÍêÁ˵¥Ôª²âÊÔÓÃÀýÖ®ºó£¬ÎÒÃǾͿÉÒÔÔÚUnity5.3.xµÄeditorÖпªÊ¼µ¥Ôª²âÊÔÁË¡£ÈçͼËùʾ£º

ÔÚÕâÀÎÒÃǼȿÉÒÔÅܵ¥¶ÀµÄ²âÊÔÓÃÀý£¬Ò²¿ÉÒÔÅÜËùÓеIJâÊÔÓÃÀý£¬Í¨¹ýµÄÊÇÂÌÉ«±êʶ£¬Î´Í¨¹ýµÄÊǺìÉ«±êʶ¡£

¶øÔÚ×îÉÏÃæµÄÒ»ÐУ¬ÔòÊÇÎÒÃÇ¿ÉÒÔ²Ù×÷µÄ²¿·Ö£º

Run All£º²âÊÔÈ«²¿ÓÃÀý

Run Selected£º²âÊÔÑ¡ÖеÄÓÃÀý

Rerun Failed£º ÖØÐ²âÊÔÉÏÒ»´Îδͨ¹ýµÄ²âÊÔÓÃÀý

ËÑË÷¿ò£º¿ÉÒÔËÑË÷ÓÃÀý

ÖÖÀà¹ýÂËÆ÷£º¿ÉÒÔ¸ù¾ÝÖÖÀàÀ´É¸Ñ¡ÓÃÀý¡£ÖÖÀàÐèÒªÔÚ²âÊÔ´úÂëÖÐʹÓÃCategoryAttributeÀ´±êʶ¡£

²âÊÔ½á¹ûɸѡÆ÷£º¿ÉÒÔ°´ÕÕͨ¹ý¡¢Ê§°ÜÒÔ¼°ºöÂÔÀ´É¸Ñ¡ÓÃÀý

ÔÚÕâÀïÎÒÃÇ»¹¿ÉÒÔÉèÖÃÔÚ±àÒëǰ×Ô¶¯ÔËÐе¥Ôª²âÊÔ¡£

ʹÓÃÃüÁîÐÐÔËÐе¥Ôª²âÊÔ£º

³ýÁËÄܹ»ÔÚEditorÖÐʹÓõ¥Ôª²âÊÔ£¬ÎÒÃÇ×ÔÈ»¸üÏ£ÍûÄܹ»½«µ¥Ôª²âÊÔÒ²ÄÉÈë×Ô¶¯¼¯³ÉµÄÁ÷Ë®ÏßÖУ¬Òò´ËÓбØÒª´ÓU3DÍⲿµ÷ÓòâÊÔ¡£²»¹ýºÃÔÚU3DÒ²ÌṩÁËÍⲿµ÷Óõķ½Ê½£¬ÕâÑù½«µ¥Ôª²âÊÔÒ²¼ÓÈëµ½ÎÒÃǵÄ×Ô¶¯¼¯³ÉµÄÁ÷Ë®ÏßÖÐÊÇ¿ÉÐеġ£

Unity3D 5.3.x°æ±¾ÖÐÌṩµÄÃüÁîÐÐÑ¡ÏîÈçÏ£º

runEditorTests ±ØÐ룬ÔËÐÐeditor testµÄÑ¡Ïî
editorTestsResultFile ÓÃÀ´±£´æ²âÊÔ½á¹û
editorTestsFilter ¸ù¾ÝÓÃÀýÃû³Æ£¬À´ÔËÐÐÖ¸¶¨µÄÓÃÀý
editorTestsCategories ¸ù¾ÝÓÃÀýÖÖÀ࣬À´ÔËÐÐÖ¸¶¨µÄÓÃÀý
editorTestsVerboseLog ´òÓ¡¸ü¼ÓÏêϸµÄÈÕÖ¾
projectPath ¹¤³ÌĿ¼
ËùÒÔÔÚÃüÁîÐÐÖпªÆô²âÊÔ¿ÉÒÔÕâÑùд£º
Unity -runEditorTests -projectPath /Users/fanyou/UnitTest -editorTestsResultFile /Users/fanyou/UnitTest/

test.xml -batchmode -quit

0x08 ºó¼Ç

ÒÔÉϱãÊǹØÓÚÔÚU3DÖÐÒýÈëµ¥Ôª²âÊÔµÄһЩ˼¿¼£¬µ±È»£¬ÓÎÏ·¿ª·¢ÊÇ·ñÊʺÏTDD£¬»»ÑÔÖ®ÊÇ·ñÒªÏÈдµ¥Ôª²âÊÔºóʵÏÖ¹¦ÄÜÊÇÖµµÃÌÖÂÛµÄÊÂÇ飬µ«Êǵ¥Ôª²âÊÔ±¾ÉíÊÇÊ®·ÖÓбØÒªÔÚ¹¤³ÌÖÐʹÓõġ£ÔÚ´úÂë½á¹¹Éè¼Æ¡¢ÈÕºóµÄÖØ¹¹¶¼»áºÜÓаïÖú¡£

 

   
2499 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù