۱۳۹۰/۱۰/۲۰

قبل از رفع باگ، براي آن تست بنويسيد


از دقت كردن در نحوه اداره پروژه‌هاي خوب و بزرگ در سطح دنيا، مي‌توان به نكات آموزنده‌اي رسيد. براي مثال NHibernate را درنظر بگيريد. اين پروژه شايد روز اول كپي مطابق اصل نمونه جاواي آن بوده، اما الان از خيلي از جهات يك سر و گردن از آن بالاتر است. پشتيباني LINQ را اضافه كرده، خودش Syntax جديدي را به نام QueryOver ارائه داده و همچنين معادلي را جهت حذف فايل‌هاي XML به كمك امكانات جديد زبان‌هاي دات نتي مانند lambda expressions ارائه كرده. خلاصه اين تيم، فقط يك كپي كار نيست. پايه رو از يك جايي گرفته اما سبب تحول در آن شده. از اهداف پروژه‌هاي سورس باز هم همين است: براي هر كاري چرخ را از صفر ابداع نكنيد.

اگر به نحوه اداره كلي پروژه NHibernate‌ دقت كنيد يك مورد مشهود است:
  • تمام گزارش‌هاي باگ بدون Unit test نديد گرفته مي‌شوند.
  • از كليه بهبودهاي ارائه شده (وصله‌ها يا patch ها) بدون Unit test صرفنظر مي‌شود.
  • از كليه موارد جديد ارائه شده بدون Unit test هم صرفنظر خواهد شد.

بنابراين اگر در issue tracker اين تيم رفتيد و گفتيد: «سلام، اينجا اين مشكل هست»، خيالتان راحت باشد كه نديد گرفته خواهيد شد.

سؤال : چرا اين‌ها اينطور رفتار مي‌كنند؟!
- وجود Unit test دقيقا مشخص مي‌كند كه چه قسمت يا قسمت‌هايي به گزارش باگ شما مرتبط هستند. نيازي نيست حتما بتوانيد يك خطا را با جملات ساده شرح دهيد. اين مساله خصوصا در پروژه‌هاي بين المللي حائز اهميت است. ضعف زبان انگليسي همه جا هست. همينقدر كه توانسته‌ايد براي آن يك Unit test بنويسيد كه مثلا در اين عمليات با اين ورودي،‌ نتيجه قرار بوده بشود 10 و مثلا شده 5 يا حتي اين Exception صادر شده كه بايد كنترل شود، يعني مشكل را كاملا مشخص كرده‌ايد.
- وجود Unit tests ، انجام Code review و همچنين Refactoring را تسهيل مي‌بخشند. در هر دو حالت ياد شده، هدف تغيير كاركرد سيستم نيست؛ هدف بهبود كيفيت كدهاي موجود است. بنابراين دست به يك سري تغييرات زده خواهد شد. اما سؤال اينجا است كه از كجا بايد مطمئن شد كه اين تغييرات، سيستم را به هم نريخته‌اند. پروژه‌ي جاري چند سال است كه در حال توسعه است. قسمت‌هاي زيادي به آن اضافه شده. با نبود Unit tests ممكن است بعضي از قسمت‌ها زايد يا احمقانه به نظر برسند.
- بهترين مستندات كدهاي تهيه شده، Unit tests آن هستند. براي مثال علاقمند هستيد كه NHibernate را ياد بگيريد؟ هرچه مي‌گرديد مثال‌هاي كمي را در اينترنت در اين زمينه پيدا مي‌كنيد؟ وقت خودتان را تلف نكنيد! اين پروژه بالاي 2000 آزمون واحد دارد. هر كدام از اين آزمون‌ها نحوه‌ي بكارگيري قسمت‌هاي مختلف را به نحوي كاربردي بيان مي‌كنند.
- وجود Unit tests از پيدايش مجدد باگ‌ها جلوگيري مي‌كنند. اگر آزمون واحدي وجود نداشته باشد، امروز كدي اضافه مي‌شود. فردا همين كد توسط عده‌اي ديگر زايد تشخيص داده شده و حذف مي‌شود! بنابراين احتمال بروز مجدد اين خطا در آينده وجود خواهد داشت. با وجود Unit tests، فلسفه وجودي هر قسمتي از كدهاي موجود پروژه دقيقا مشخص مي‌شود و در صورت حذف آن‌، با اجراي آزمون‌هاي خودكار سريعا مي‌توان به كمبودهاي حاصل پي‌برد.