10 نکته برای تستینگ بهتر – بخش اول

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 09 شهریور 1397
دسته بندی ها : برنامه نویسی

صنعت توسعه وب در حال حاضر پیچیده‌تر از همیشه است. ابزارهای طراحی وب، ویژگی‌های مرورگر، فریمورک‌های فرانت و... تقریبا هر ماه تغییر می‌کنند و همواره بروز می‌شوند. همراه با این بروزرسانی‌ها همواره ریسک‌ خراب شدن همه چیز وجود دارد. اما چگونه می‌توانیم خود را از این خراب کاری‌های غیر عمدی نجات دهیم؟

برای یادگیری تست و مفاهیم آن و همچنین یادگیری ایجاد تست در جاوااسکریپت میتوانید دوره Unit Test در جاوااسکریپت را مشاهده کنید

منظورمان از تستینگ پروسه‌ای است که این ریسک‌ها را کمتر می‌کند. اگر یک کاربر در یک وبسایت با مشکلی مواجه شود سراغ وبسایت رقبا می‌رود، پس شانس بسیار کمی برای برگشت وجود دارد.با بررسی کردن تمام قسمت‌هایی که یک وبسایت را می‌سازد شانس اینکه کاربران‌تان را از دست دهید بسیار کم می‌شود.

مطمئنا چیزهای بسیار بیشتری نسبت به مقوله User Testing برای پاک کردن کدهای‌تان از خطاها و اشکالات وجود دارد. مراحل بسیار بیشتری در روند تست اپلیکیشن وجود دارد. با در نظر گرفتن این مراحل کاربران می‌توانند اپلیکیشنی مناسب را در اختیار داشته باشند.

۱. نوشتن تست واحد‌های بسیار

کدهای بدون ساختار یکی از عوامل اصلی برای ایجاد باگ به حساب می‌آید. نه تنها اینگونه کدها درک و ارتقا برنامه را سخت می‌کنند بلکه برای تست کردن نیز راه سختی را در پیش دارند. با در نظر گرفتن قطعات بسیاری که همگی به صورت مستقیم به همدیگر مربوط می‌شوند و مبتنی بر یکدیگرند، تستی که می‌نویسید باید تمامی قسمت‌ها را در یک زمان در بر بگیرد. این کار درک اینکه چه قسمت‌هایی از برنامه به درستی کار نمی‌کند را دشوار می‌کند.

هر قسمت از اپلیکیشن باید به قسمت‌های کوچک‌تر و مربوط‌تری تقسیم شود. برای مثال، فرم ورود باید با کوئری‌های بانک اطلاعاتی، احرازهویت و مسیریابی در یک بسته یا واحد قرار بگیرند. هر کدام از این موارد شانس داشتن کلاس، تابع و یا کامپوننت خود را دارند.

پایه و اساس یک کدنویسی خوب داشتن مجموعه تست‌های واحد است. این موارد باید تمام کدها را پشتیبانی کند و قابلیت اجرا به صورت سریع را داشته باشد. بیشتر تست‌های واحد و فریمورک‌های‌شان ساختار مشابهی را به اشتراک می‌گذارند:

<pre>
describe("DateLocale", function() {
  test("provides the day in the correct language", function() {
    var date = new DateLocale("en");
    date.setDate(new Date(1525132800000));
    expect(date.getDay()).toBe("Tuesday");
  });
});
</pre>

بلاک مربوط به describe قطعه کدی که برای تست آماده شده است را نمایش می‌دهد. در داخل این بلاک تعدادی تست وجود دارد که یک سناریو را ایجاد کرده و نتایج پیشبینی شده ما را با نتایج واقعی مقایسه می‌کند. اگر نتیجه تست‌ها برابر نباشد در نتیجه باید تغییرات را اعمال کنیم.

با ایجاد و اجرای تست‌های واحد می‌توانیم فایل‌ها را تغییر دهیم، می‌توانیم مطمئن شویم که هیچ چیزی به صورت اتفاقی بهم نمی‌ریزد. از آنجایی که در تست واحد ما قسمت‌هایی از کدها را ایجاد می‌کنیم، می‌توانیم از آن‌ها نیز در پروژه‌های دیگری استفاده نماییم.

ابزارهای بسیاری برای نوشتن تست‌های واحد وجود دارند که برخی از آن‌ها شامل Jest، Jasmine و Ava می‌شوند. با مشاهده هر مورد می‌توانید براساس نیاز و چهارچوب‌تان بهترین مورد را انتخاب کنید.

۲. وقتی که لازم بود از تست‌های دوگانه استفاده کنید

درحالیکه تعداد تست‌ها مشخص است اما هر زمان که بخواهید می‌توانید تست‌ها را بیشتر از تعداد اصلی‌شان استفاده کنید. اگر یک تابع مبتنی بر یک کتابخانه خارجی باشد، در آن صورت هر باگ و خطایی که از آن کتابخانه صادر شود در تست‌های واحد ما اشکال بوجود می‌آورد. این حتی در صورتی خواهد بود که کدهای‌ شما بدون مشکل باشد. 

راه‌حل موجود برای این مسئله استفاده از Test Doubles یا تست‌های دوگانه است. برای چنین موردی رویکرد ما مطابق با همیشه خواهد بود اما این حالت همواره به ما یک نتیجه پیشبینی شده را برگشت می‌دهد. سه بخش اصلی از این تست عبارت است از «mocks»، «stubs» و «spies».

Mock یک کلاس و یا یک شئ است که مقدار واقعی یک تست را نگه‌داری می‌کند. آن‌ها رابط یا interface مشترکی دارند اما هیچگونه کارکرد رویکردی را ارائه نمی‌دهند.

Stub نیز شبیه به Mock است اما با رفتار از پیش برنامه‌ریزی شده جواب می‌دهد. از این مورد برای شبیه سازی قسمت خاصی از یک اپلیکیشن در زمان تست کردن استفاده می‌شود.

Spy بیشتر روی شیوه فراخوانی متدها در interfaceی که فراخوانی کرده‌ایم تمرکز دارد. این موارد معمولا برای بررسی زمان اجرای تابع استفاده می‌شود. همچنین تعداد دفعات تابع و آرگومان‌های آن نیز بررسی می‌شود. از این طریق می‌شود همه چیز را به درستی کنترل کرد.

کتابخانه‌هایی مانند Sinon، Testdouble و Nock تست‌های دوگانه عالی و آماده‌ای را برای ما فراهم می‌کنند. Jasmine نیز ابزارهایی داخلی برای انجام چنین کاری را ارائه می‌دهد. 

۳. شیوه کاری کامپوننت‌ها با یکدیگر را بررسی کنید

بعد از اینکه کدها در کامپوننت‌های متفاوتی از یکدیگر قرار گرفتند، بعد از آن نیاز داریم که شیوه کار کردن آن‌ها با یکدیگر را تست کنیم. اگر لایه احرازهویت نتواند چیزی که از بانک اطلاعاتی برگشت داده می‌شود را درک کند، هیچکسی قادر به انجام فرایند Log in نخواهد بود. این موارد با عنوان تست‌های ادغام‌سازی نیز شناخته می‌شود. این موارد شیوه کار کردن یک قسمت از اپلیکیشن با دیگر بخش‌ها را بررسی می‌کند. در حالی که تست‌های واحد از همدیگر جدا هستند و در واقع در یک فضای ایزوله شده قرار می‌گیرند، تست‌های ادغام‌سازی روی ارتباط داشتن بین دو قسمت تمرکز دارند. 

مانند تست‌های واحد در تست‌های ادغام‌سازی نیز ما نتایج نهایی را براساس مقادیری که قبلا وارد شده بررسی می‌کنیم. در مثال لایه احراز هویت و فرایند ورورد ما زمان آخرین ورود به سیستم را که در بانک اطلاعاتی قرار گرفته است در نظر می‌گیریم. 

از آنجایی که انجام تست ادغام‌سازی به بررسی قسمت‌های مختلفی می‌پردازد در نهایت کندتر خواهد بود. بنابراین باید کمتر از آن‌ها استفاده شود. به صورت ایده‌آل از این تست تنها در زمانی استفاده می‌شود که یک ویژگی‌ به صورت کامل ایجاد شده باشد.

۴. مسیر هر کاربر را در سیستم دنبال کنید

بالاترین سطح از تست‌های خودکار فرایندی معروف به «end-to-end» یا فانکشنال تستینگ است. همانطور که نام اشاره دارد این سطح تمام کنش‌های کاربری که از ابتدای وارد شدن به سیستم شروع می‌شود تا آخرین مرحله را ذخیره و پشتیبانی می‌کند. این شیوه از تست سناریوهای واقعی و همچنین شیوه‌ای که کاربر دوست دارد با یک پلتفرم تعامل داشته باشد را شبیه‌سازی می‌کند.

از آنجایی که این تست‌ها مبتنی بر رابط کاربری هستند بنابراین نیز دارند که با تغییرات رابط کاربری بروزرسانی شوند. زمان بارگذاری طولانی مدت نیز می‌تواند باعث بوجود آمدن مشکلات شود. اگر هر کدام از کنش‌ها نتوانند به اندازه کافی به سرعت کامل شوند در نهایت منجر به شکست خوردن تست‌ می‌شوند.

ابزارهایی مانند Selenium و Puppeteer می‌توانند در نوشتن چنین تست‌هایی بسیار کارآمد باشند. آن‌ها مرورگر را قادر می‌سازند تا از طریق کدها قابلیت کنترل داشته باشد و پروسه‌هایی را به صورت خودکار انجام دهد.

۵. بودجه‌های کارایی را تنظیم کنید

دنیای مدرن توسعه فرانت اند معمولا شامل پروسه ایجاد باندل‌هایی برای هر پروژه‌ای می‌شود. این باندل‌ها معمولا همراه با حجم زیادی از موارد جانبی ارائه می‌شوند. بدون داشتن دقت کافی در این رابطه ممکن است چنین باندل‌هایی روی کارایی‌تان تاثیر منفی بگذارد.

باید ابزارهایی را به خدمت بگیرید که بتواند چنین نظارتی را روی کارایی اپلیکیشن‌تان داشته باشد. WebPagetest ابزاری است که نگاه جامع و کلی را برای کارایی یک وبسایت ارائه می‌دهد. همچنین شیوه‌هایی را برای بهبود وضعیت وبسایت به نمایش می‌گذارد. سرویس‌های زنده‌ای مانند Pingdom نیز می‌توانند کارایی یک وبسایت را همراه با داده‌های واقعی مربوط به کاربران دنبال کنند. 

منبع

مقالات پیشنهادی

بهترین پکیج های لاراولی – سری اول

پکیج ها قابلیت عملیاتی لاراول را افزایش می‌دهند و عملکرد آنرا بهبود می‌بخشند. پکیج ها میتوانند یک راه مناسب برای کار با تاریخ در پروژه باشد مثل پکیج C...

10 نکته برای تستینگ بهتر – بخش دوم

تمام وبسایت‌ها باید به راحتی برای همه افراد قابل دسترس باشد. در حالیکه تست‌های استفاده‌پذیری اغلب به استفاده افراد با ناتوانی‌هایی اشاره دارد اما تغیی...

10 تا از بهترین helper های لاراول برای استفاده

لاراول شامل توابع مختلف کمکی یا helper هست.در لاراول تعداد زیادی تابع کمکی وجود دارد که شما میتونید با استفاده ازشون کارتون رو راحت تر و سریعتر کنید....

چرا لاراول بهترین فریمورک 2017 است ؟

با تعداد زیاد فریمورک های موجود برای PHP این میتونه گیج‌کننده باشه که بهترین رو انتخاب کنید, مخصوصاً وقتی که بخواید یک اپلیکیشن وب فوق‌العاده برای کسب...