Unit Testing
مقدمه
پروژههای بزرگ از قسمتهای مختلفی تشکیل شدهاند که گاهی اوقات به یکدیگر وابستهاند و بر حسب نیاز ممکن است بخواهید یکی از این بخشها را تغییر دهید؛ چگونه میتوانید از صحت کارکرد قسمتهای وابسته اطمینان حاصل کنید؟ برای پاسخ به این سوال، در این فاز به بررسی راههای مختلف تستکردن سامانه میپردازیم.
- چه راههایی برای تستکردن سامانه وجود دارد؟
- مزایا و معایب این روشها نسبت به یکدیگر چیست؟
- در Angular چگونه میتوان تست نوشت؟
- چگونه میتوان فهمید چند درصد از کدهای موجود تست شدهاند؟
یادگیری
راههای مختلف تستکردن سامانه
Manual Testing
یکی از راههایی که احتمالاً تا کنون از آن استفاده میکردید، تستکردن دستی سامانه است. هرچند که این روش بسیار ساده و قابلفهم است اما معایبی دارد:
- بسیار وقتگیر است.
- پس از مدتی به کاری تکراری و خستهکننده تبدیل میشود.
- ممکن است انسان اشتباه کند و متوجه عملکرد اشتباه سامانه نشود.
- ممکن است انسان فراموش کند و بخشی از سامانه را تست نکند.
برای حل مشکلات بالا، از روشهای تست خودکار استفاده میکنیم که در ادامه به توضیح آنها میپردازیم.
End-to-End Testing
در روش e2e برنامهای مینویسیم که تمام عملیاتی که توسط کاربر انجام میشود را به ترتیب انجام دهد. این برنامه خود را جای کاربر جا میزند و کوچکترین اعمال انسان را نیز طبق یک الگوریتم، خط به خط اجرا میکند. این روش نزدیکترین روش به تست دستی است اما متاسفانه احتیاج به منابع زیادی از جمله زمان دارد.
Integration Testing
ممکن است برنامۀ شما با چند برنامۀ دیگر در ارتباط باشد. بهعنوان مثال ممکن است شما قسمت فرانتاند یک پروژه را توسعه دهید و برنامهنویس دیگری قسمت بکاند آن را نوشته باشد. برای اطمینان از یکپارچگی قسمتهای مختلف و تعامل مناسب آنها با یکدیگر از Integration Testing استفاده میکنیم.
Unit Testing
همانطور که از اسم آن مشخص است، در Unit Testing به تستکردن کوچکترین اجزاء یک برنامه یعنی توابع، کلاسها و متغیرها میپردازیم. در این روش معمولاً به ظاهر سایت یا تجربۀ کاربر توجه نمیکنیم و صرفاً کارکرد صحیح Unitها را مورد بررسی قرار میدهیم. در ادامه به نحوۀ نوشتن Unit Test در Angular میپردازیم.
Unit Testing in Angular
خوشبختانه Angular بهصورت پیشفرض از Unit Testing پشتیبانی میکند. در Angular میتوانید با استفاده از ابزارهای Karma و Jasmine به نوشتن تست بپردازید. این تستها برای اطمینان از عملکرد صحیح تمام قسمتهای سامانه، اعم از کامپوننتها، سرویسها، توابع و ... میتوانند مورد استفاده قرار بگیرند.
برای راهاندازی این امکان، نیاز به انجام کار خاصی نیست؛ صرفاً کافی است با اجرای دستور زیر در Terminal، تستهای موجود را اجرا کنید:
ng test
با اجرای دستور بالا یک مرورگر باز خواهد شد که لیستی از تستها را به شما نشان میدهد؛ همچنین مشخص میکند کدامیک از آنها موفق و کدامیک ناموفق بودهاند.
از آنجایی که سایت Angular بهطور کامل در مورد تستنویسی توضیح داده است، شما را به مطالعۀ مستندات مربوطه دعوت میکنیم و از آوردن مطالب تکراری در این مستند میپرهیزیم.
برای آشنایی بیشتر با این مفهوم میتوانید از لینکهای زیر استفاده کنید:
- Angular - Intro to Testing
- Angular - Code Coverage
- Angular - Testing services
- Angular - Basics of Testing Components
- Angular - Component Testing Scenarios
Mocking
زمانی که به تستکردن قسمتی از سامانه میپردازیم، ممکن است این قسمت با قسمتهای دیگر در ارتباط باشد و برای اجرای تستها، کدهای دیگری احتیاج به اجراشدن داشته باشند که ممکن باشد در عملکرد قسمت فعلی خلل ایجاد کنند. بهعنوان مثال فرض کنید بخواهیم سرویسی را تست کنیم که برای انجام عملیاتی احتیاج به فرستادن Request به سرور داشته باشد؛ قطعاً منطقی نیست برای اجرای تستها نیاز باشد چندصد میلیثانیه منتظر دریافت پاسخ از سرور باشیم؛ از طرفی ممکن است به هر علتی سرور دچار مشکل شده باشد و نتواند پاسخ درستی به ما برگرداند و تستها Fail شوند. در چنین مواقعی از Mocking استفاده میکنیم؛ بهطوری که یک کلاس یا شیء غیرواقعی میسازیم و آن را جای کلاس یا شیء اصلی جا میزنیم.
برای آشنایی بیشتر با این مفهوم میتوانید از لینک زیر استفاده کنید:
پروژه
برای تمام کامپوننتها و سرویسهای پروژۀ خود Unit Test بنویسید و مطمئن شوید حداقل 80درصد کدها تست شده باشند.
از هر دو عضوِ یکی از تیمها درخواست کنید تا کد شما را جداگانه Review کنند؛ بعد از اینکه Approve کردند، به منتور عادی مراجعه کنید و پس از Approve او، به منتور سنیور بگویید تا کد شما را ببیند.
همچنین لازم است شما هم حداقل کد یک تیم دیگر را Review کنید. سعی کنید تمام مواردی که در این فاز یاد گرفتید را هنگام Review مورد بررسی قرار دهید.