PDA

View Full Version : حرفه ای: آزمایش واحد در JavaScript با UniTest



emdadgar2
دوشنبه 12 مهر 1389, 23:22 عصر
آزمايش واحد چيست؟

آزمايش واحد (unit testing) هنر و تمرين بررسي صحت عملكرد قطعه‌اي از كد (كه در اينجا واحد ناميده شده است)، به وسيله كدهاي ديگري است كه توسط برنامه نويس نوشته خواهند شد. عموما اين آزمايش‌ها جهت بررسي يك متد تهيه مي‌شوند. در اين مرحله بايد درنظر داشت كه هدف، بررسي كارآيي نرم افزار نيست. هدف اين است كه بررسي كنيم آيا قطعه كد جديدي كه به برنامه اضافه شده است درست كار مي‌كند و آيا هدف اصلي از توسعه آن‌را برآورده مي‌سازد؟
براي مثال متدي را توسعه داده‌ايد كه آدرس يك دومين را از آدرس اينترنتي دريافت شده، جدا مي‌سازد. با استفاده از آزمايشات واحد متعدد مي‌توان از صحت عملكرد آن اطمينان حاصل كرد.


اهميت و مزاياي آزمايش واحد كدامند؟


كامپايل شدن كد به معناي صحت عملكرد آن نيست. حتما نياز به روش‌هايي براي آزمايش سيستم وجود دارد. صرفا به شما حقوق داده نمي‌شود كه كد بنويسيد. به شما حقوق داده مي‌شود كه كد قابل اجرايي را تهيه كنيد.
نوشتن آزمايش‌هاي واحد به توليد كدهايي با كيفيت بالا در دراز مدت منجر خواهد شد. براي نمونه فرض كنيد سيستمي را توسعه داده‌ايد. امروز كارفرما از شما خواسته است كه قابليت جديدي را به برنامه اضافه كنيد. براي اعمال اين تغييرات براي مثال نياز است تا قسمتي از كدهاي موجود تغيير كند، همچنين كلاس‌ها و متدهاي جديدي نيز به برنامه افزوده گردند. پس از انجام درخواست رسيده، چگونه مي‌توانيد اطمينان حاصل كنيد كه قسمت‌هاي پيشين سيستم كه تا همين چند لحظه پيش كار مي‌كردند، اكنون نيز همانند قبل كار مي‌كنند؟ حجم كدهاي نوشته شده بالا است. آزمايش دستي تك تك موارد شايد ديگر از لحاظ زماني مقدور نباشد. آزمايش واحد روشي است براي اطمينان حاصل كردن از اينكه هنگام تحويل كار به كارفرما مرتبا سرخ و سفيد نشويم! به اين صورت عمليات refactoring كدهاي موجود بدون ترس و لرز انجام خواهد شد، چون بلافاصله مي‌توانيم آزمايشات قبلي را اجرا كرده و از صحت عملكرد سيستم اطمينان حاصل نمائيم. بدون اينكه در زمان تحويل برنامه در هنگام بروز خطا بگوئيم : "اين غيرممكنه!"
روال‌هاي آزمايشات صورت گرفته در آينده تبديل به مرجع مهمي جهت درك چگونگي عملكرد قسمت‌هاي مختلف سيستم خواهند شد. چگونه فراخواني شده‌اند، چگونه بايد به آن‌ها مقداري را ارجاع داد و امثال آن.
با استفاده از آزمايش‌هاي واحد، بدترين حالات ممكن را قبل از وقوع مي‌توان در نظر گرفت و بررسي كرد.
نوشتن آزمايش‌هاي واحد در حين كار، برنامه نويس را وادار مي‌كند كه كار خود را به واحدهاي كوچكتري كه قابليت بررسي مستقلي دارند، بشكند. براي مثال فرض كنيد متدي را توسعه داده‌ايد كه پس از انجام سه عمليات مختلف بر روي يك رشته، خروجي خاصي را ارائه مي‌دهد. هنگام آزمايش اين متد چگونه مي‌توان اطمينان حاصل كرد كه كدام قسمت سبب شكست آزمايش شده است؟ به همين جهت برنامه نويس جهت ساده‌تر كردن آزمايشات، مجبور خواهد شد كه كد خود را به قسمت‌هاي مستقل كوچكتري تقسيم كند.
با توجه به امكان اجراي خودكار اين آزمايشات، به عنوان جزئي ايده‌آل از پروسه توليد نرم افزار محسوب مي‌شوند
http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=unitest&DownloadId=154903&Build=17184
خوب حالا چگونه در JavaScript از تست واحد استفاده کنیم؟
من پس از بررسی روش ها و framework های موجود، امکانات آنها را کافی ندیده و اقدام به ایجاد یک framework برای این امر کردم.
این فریم ورک که UniTest نام دارد، بسیار سبک، قابل استفاده در تمامی مرورگرها و دارای قابلیت intellisense در visual studio می باشد و دارای طیف قابل توجهی تست می باشد. همچنین به دلیل اینکه این فریم ورک هر بار توسط کاربران سایت و یا حتی برنامه نویسان لود نشده و ترافیک سرور را زیاد نکند، بخشی هم به عنوان lazy load برای آن طراحی شده که با استفاده از آن می توان تست ها را طراحی و پس از ذخیره تست ها در فایل های مجزا، در صورت نیاز با فشردن کلید ترکیبی Ctrl+F12 در مرورگر خود، تست ها را اجرا کنید.
قابلیت ایجاد تست های خاص به صورت function های JavaScript نیز در آن گنجانده شده است. همچنین خروجی های متعددی نیز برای نتایج تست دارد که علاوه بر اینکه در حال توسعه آن هستم، API توسعه آن نیز بسیار ساده است و به سادگی می توانید با استفاده از آن خروجی مورد نیاز خود را تهیه کنید.

این پروژه از طریق http://unitest.codeplex.com قابل دسترسی است.
آموزش استفاده و مستندات مربوط به API های آن در صورت لزوم قابل ارائه خواهد بود.

طرح هایی هم برای توسعه آن و همچنین اجرای تست به صورت مستقیم از طریق vstudio و resharper وجود دارد که درحال پیگیری است.
به دلیل اینکه برنامه برای همه قابل بهره برداری باشد، در حال حاظر بخش intellisense آن انگلیسی است ولی به زودی intellisense فارسی هم اضافه خواهد شد.
http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=unitest&DownloadId=154904

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=unitest&DownloadId=154905