چرا اکثرا تست واحد را اشتباه میپندارند؟

یک ویژگی مهم در تست واحد وجود دارد که بسیاری از تیمهای برنامهنویس از آن غافلند
یکی از بزرگترین راههایی که افراد میتوانند در تکنولوژیها به طور موثری نفوذ کنند، استفاده از تست واحد(Unit Testing) به صورت صحیح است. بیشتر تیمهای کاری یا اصلا از تست واحد استفاده نمیکنند یا بیش از اندازه آن را بکار میبرند. تست واحد کیفیت را افزایش میدهد بدون آنکه مانع بهرهوری شود، ولی باید قادر به حفظ تعادل باشید که در این صورت ازکیفیت بهتر محصول با هزینه کمتر لذت خواهید برد.
تست واحد چیست؟
ابتدا مفهوم صحیح تست واحد را توضیح دهیم چراکه این اصطلاح بارها اشتباه بکار برده شده است. تست واحد فرایند تست بخشها یا واحدهای کوچک از برنامه نرمافزاری است. بدلیل اینکه حوزه هر تست واحد بسیار محدود است، تنها راه تست آن نوشتن قطعه کدی است که کد مورد نظر را تست کند که اینکار معمولا با استفاده از چارچوبهایی مثل JUnit ،NUnit یا Microsoft Testing Framework انجام میشود. توضیح جزییات نحوه کار آن خارج از حوزه پست امروز است، اما مختصرا تست واحد بدین معنی است که برنامهنویس تابع تست مینویسد که تابع واقعی را فراخوانی کند و به او امکان میدهد تا بداند آیا نتایج واقعی با نتایج مورد انتظار همخوانی دارد یا خیر. اشتباها بسیاری از برنامهنویسان که با چارچوبهای تست واحد آشنایی ندارند، به تستهای دستی که خودشان انجام میدهند به عنوان تست واحد اشاره میکنند، درحالیکه آنها تست واحد نیستند فقط تست هستند.
چرا باید کدی نوشت تا کد ما را تست کند؟
برای کسی که برنامه نویس نیست ایده نوشتن کد برای تست کد شاید احمقانه به نظر برسد اما برای آنهایی که این کار را انجام میدهند منافع آن بسیار روشن است:
۱٫ در هنگام تستهای قدیمی شما مجبورید مجموعهای از عملیات خاص را انجام دهید تا کارکرد خاصی را تست کنید. این کار به طور باورنکردنی غیرموثر و زمانبر است. تست واحد به برنامه نویس اجازه میدهد که تست خاصی را بر روی قسمتی از کد که مورد نظر است انجام دهد.
۲٫ وقتی جایی دچار اشکال میشود نیازی نیست که تیم برنامهنویس برای یافتن منبع اشکال به کل سیستم مراجعه کنند. آنها میتوانند تمام تستهای واحدی را که قبلا ایجاد کردهاند را اجرا کنند و بازه جستجوی خود را محدود کنند.
۳٫ در نهایت همانطور که در مقاله بازآرایی کد و الزامات کسبوکار اشاره شد، باز اجرا کردن(Rerunning) همه تستهای واحد، راهی بسیار خوب برای اطمینان از درستی کامل کد است.
چه زمان از تست واحد استفاده شود؟
بیشتر تجربیات من با برنامهنویسان این است که تفکرشان درباره مسائل دیجیتال(درست یا نادرست) است. اگر درست است که تست واحد نوشته شود، پس باید برای همه کدها نوشته شود. در اینجا دو باور درباره تست واحد وجود دارد که نه تنها مؤثر نیست بلکه میتواند به پروژه شما آسیب برساند.
ایده پشت Test Driven Development این است که شما تست واحد خود را مینویسید پیش از آنکه کد آن بخش از محصول را تولید کنید. سپس کد محصول را مینویسید و تستها را روی آن اجرا میکنید. اگر نیاز به تغییر بود ابتدا تستها را تغییر میدهید، سپس کد را بازنویسی میکنید. ایده خوبی است، اما بخشهایی از کد اصلا نیازی به تست واحد ندارد. فقط قسمتهای پیچیده پروژه نیاز به تست واحد دارد و نوشتن تست برای منطقهای ساده بیشتر وقت برنامهنویس را تلف میکند و ارزشی به کار اضافه نمیکند.
۱۰۰% پوشش کد
یک استاندارد مشترک که تیمهای نرمافزاری آن را دنبال میکنند، پوششدهی کامل کد است. به عبارت دیگر چه درصدی از کدی که برای محصول نوشته شده است توسط تست واحد تست شده است. بسیاری از مدیران پروژه معتقدند برای اطمینان کافی از کیفیت، لازم است تست واحد در کل کد صد در صد پوشش داده شود. کدی که بسیار تست شده باشد به سختی تغییر میکند. ولی اگر تست واحد بیش از حد استفاده شود، تیمهای نرمافزاری برای هر تغییری در کد ملزم هستند تستهای واحد موجود را نیز تغییر دهند و این هزینهها ممکن است خارج از کنترل باشد.
بنابراین تعادل در کجاست؟
متأسفانه قانون محکم و سریعی وجود ندارد که بدانیم تست واحد در چه شرایطی باید نوشته شود ولی در اینجا چند دستورالعمل پیشنهاد میشود:
• هنگامیکه منطق کد شما به اندازه کافی پیچیده است و شما احساس میکنید به طور وسیعی نیاز به تست آن دارید.
• هنگامیکه بخش خاصی از کد دچار اشکال میشود و شما بیش از چند دقیقه برای رفع آن وقت صرف میکنید.
• هنگامیکه نوشتن تست واحد کمتر از بررسی درستی کد زمان میبرد.
به طور خلاصه تست واحد میخواهد به تیم برنامهنویس کمک کند تا هزینهها را کاهش داده، زمان تست را کم کند و در نهایت نگهداری سیستم آسانتر شود. نوشتن تست واحد کار صحیحی است اگر میخواهید پروژه نرمافزاری شما موفق باشد.
برای کسب اطلاعات بیشتر درباره نحوه ایجاد تست واحد در جاوا، به اسلایدهای جاواکاپ درباره JUnit مراجعه کنید.
منبع: سایت javaworld