در این مطلب قصد داریم به صورت مختصر اطلاعاتی در مورد Unit Testing و مزایای آن به شما ارایه دهیم. اما پیش از هر چیز، باید بدانیم که اصلا Unit Testing چیست؟
Unit Testing در واقع تمرینی است برای نوشتن کدها، تست و اجرای آنها به صورت خودکار.
به عنوان مثال، به کد زیر دقت کنید:
const calculate = (number) => { if (x) return ... if (y) return ... return ... }
تصور کنید که شما این تابع را در جایی از کدتان نوشتهاید. همانطور که میبینید، این یک تابع محاسباتی است که ورودیهایی را میگیرد و بسته به برخی شرایط، مقادیر مختلفی را برمیگرداند.
اگر بخواهید این تابع را به صورت دستی تست کنید، باید برنامهتان را اجرا کنید. ممکن است در این پروسه مجبور باشید login شوید و یا شاید چند کلیک در اینجا و آنجا انجام دهید تا در نهایت به صفحهای برسید که این تابع در آنجا استفاده شده است. سپس باید یک فرم را پر کنید، آن را ارسال و در نهایت بررسی کنید که آیا این تابع نتیجه صحیح را برگردانده است یا نه.
در تست دستی، شما مجبورید همه این مراحل را بارها و بارها تکرار کنید و برای بررسی دقیقتر مقادیر مختلفی را در فرم خود وارد کنید.
پس میتوانیم نتیجه بگیریم که تست دستی هزینهبر است.
همانطور که میبینید، این کار بسیار زمانبر و هزینهبر است. چرا که این پروسه برای آزمایش کدتان ممکن است در هر بار چندین دقیقه از وقت شما را به خود اختصاص دهد. این تنها یک نمونه از تابعهایی است که ممکن است در برنامه شما وجود داشته باشد. مسلم است که در یک برنامه واقعی، دهها و یا صدها تابع همانند این داریم!
بنابراین، از آنجایی که برنامه شما ممکن است حجیم و پیچیده باشد، به تبع آن زمان لازم برای تست دستی همه تابعها نیز افزایش مییابد. به همین خاطر است که ما از تست خودکار استفاده میکنیم.
با تست خودکار، شما یک پروژه جداگانه برای نوشتن کدهای تستی ایجاد میکنید. در این پروژه شما کد مینویسید و به طور مستقیم این تابع را برای ورودیهای مختلف فراخوانی میکنید. در نهایت، بررسی میکنید که این تابع خروجی مناسب را برگردانده است یا نه.
let result = calculate(1); verify(result == 1.5);
ما اینگونه تستها را با عنوان Unit Tests یاد میکنیم. با Unit Tests ما یک واحد از برنامه را بدون وابستگیهای خارجی مثل فایلها، دیتابیسها، وبسرویسها و غیره آزمایش میکنیم.
در کنار این، تستهایی که شامل وابستگیهای خارجی میشوند، Integration Tests نامیده میشوند که خارج از بحث این مطلب است.
ویژگی خوبی که Unit Tests دارد این است که آنها قابل تکرار هستند. شما آنها را یکبار مینویسید و یک میلیون بار از آنها استفاده میکنید!
از این رو، هر بار که بخواهید کد خود را تغییر دهید، تنها کافی است Unit Tests را تغییر دهید تا نتایج را با همان ورودیهای مورد نظر مشاهده کنید.
با استفاده از این رویکرد، میتوانید کلیه مسیرهای اجرایی تابع را در کسری از ثانیه تست کنید. شما میتوانید صدها و هزاران Unit Tests برای بخشهای مختلف برنامه خود بنویسید و همه آنها را در چند ثانیه اجرا کنید.
آیا تاکنون در شرایطی قرار گرفتهاید که همه کارهای مربوط به کدهای برنامه را راست و ریست کرده و با این ذهنیت که همه چیز در بهترین روال ممکن است محل کارتان را ترک کنید. اما پس از مدتی رئیستان یا یک کاربر با شما تماس گرفته و میگوید که یکی از تابعهای برنامه کار نمیکند؟
در این صورت، شما مجبور میشوید که دوباره به محل کار برگردید و با سرعت اشکال به وجود آمده را رفع کنید و تا شب نشده به خانه برگردید.
در این شرایط Unit Tests به کمک شما میآید. در حقیقت، Unit Tests به شما کمک میکند تا با اطمینان خاطر کدهایتان را بنویسید و گشترش دهید.
اگر کدهای خود را به طور صحیح با مجموعه کاملی از تستها کاور کرده باشید، میتوانید این تستها را قبل از گسترش کدهایتان اجرا کنید. در این صورت، چنانچه اشکال و یا اروری وجود داشت، به موقع از آن اطلاع خواهید یافت. در نتیجه، با استفاده از Unit Tests میتوانید فوراً از اشکالات مطلع شوید و اطمینان بیشتری از کدتان داشته باشید.
بنابراین، یکی از مزیتهایی که Unit Tests برای برنامهنویسان دارد، این است که تعداد نقصها و یا ایراداتی که در کد به وجود میآید، به حداقل میرسد. توجه داشته باشید که نمیگوییم با استفاده از Unit Tests هیچ مشکلی پیش نخواهد آمد. بلکه میگوییم تعداد خطاها کاهش یافته و کیفیت برنامه بهبود خواهد یافت.
اگر چند خط از متد را به یک متد private جداگانه extract کنید، به این کار Refactoring یا اصلاح مجدد کد میگویند. حتی اگر نام یک متد را عوض کنید، در واقع شما Refactoring انجام دادهاید.
به عبارت بهتر باید بگوییم که اصلاح مجدد و یا ویرایش کد بدان معنی است که ساختار کد شما تغییر کند، اما بدون تغییر رفتار آن.
این در حالی است که اگر از Unit Tests استفاده نکنید، برای انجام این کار، باید هر بار کد خود را به صورت دستی اصلاح کنید و یا تغییر دهید که بسیار زمانبر است. همچنین ممکن است باز هم اشکالاتی به وجود بیاید و کار را برای شما سختتر کند.
با Unit Tests، به صورت خودکار کدهای شما Refactor میشوند، تستها اجرا میشوند و این اطمینان را به شما میدهد که که تغییرات به درستی و به سرعت انجام یافته است.
هنگامی که تستهایی را برای برنامهتان مینویسید، به طور تقریبی مطمئن هستید که همان خروجی را دریافت خواهید کرد که انتظارش را داشتید. این اطمینانخاطر به شما کمک میکند تا برنامههایی با کیفیت بهتر و نقص کمتر تولید کنید.
بسیاری از اشکالات و خطاها در برنامهها ناشی از مواردی است که پیشبینی نشده است. بنابراین، باید آنها را پیشبینی کرد و در جهت رفع مشکلات کوشید. Unit Tests نیز همین اطمینان را به شما خواهد داد. چرا که با استفاده از آن، هر تابع با ورودیهای مختلف خروجیهای درست و مناسبی را خواهد برگرداند.
همین امر موجب میشود که کدهای بهتری بنویسید و میزان کیفیت کارتان افزایش پیدا کند. زیرا کدهایتان تمیز و خوانا خواهد بود و دقیقاً مشخص است که وظیفه هر پارامتر چیست.
اگر یک توسعهدهنده ارشد هستید، باید بدانید که چگونه Unit Tests را بنویسید. چرا که در غیر این صورت، احتمالا یک توسعهدهنده سطح متوسط هستید و نه ارشد.
در این راستا، اگر یک توسعهدهنده متوسط هستید و میخواهید به مقام ارشد دست یابید، باید عنوان استفاده از Unit Testing را در رزومه کاری خود داشته باشید. زیرا این روزها اکثر شرکتها و برنامهنویسان خوب تمایل دارند که با Unit Testing کار کنند.
[button class=”github-btn” href=”http://frontcast.ir/getting-started-with-jest/”]شروع کار با Jest[/button]
دیدگاهها: