پیشگفتار
یادمه اولین پروژهای که توش تست واحد (unit testing) رو امتحان کردم، ظاهراً خوب پیش رفت؛
ولی وقتی پروژه تموم شد و برگشتم سراغ تستها، حس کردم خیلیهاشون واقعاً اتلاف وقت بودن. بیشتر تستهایی که نوشته بودم کلی وقت صرف تنظیم انتظارات و وصل کردن یه شبکهی پیچیده از وابستگیها میکردن. همهی این دردسرها فقط برای اینکه مطمئن بشم سه خط کد توی کنترلرم درست کار میکنن. نمیتونستم دقیقاً بگم مشکل تستها چی بود، ولی حسم یهجورایی واضح بهم میگفت که یه جای کار میلنگه.
خوشبختانه تست واحد رو کنار نذاشتم و تو پروژههای بعدی هم ازش استفاده کردم. اما از همون موقع یه جور دلخوری از روشهای رایج تستنویسی تو ذهنم شکل گرفت و کمکم بیشتر شد. تو این سالها زیاد دربارهی تست واحد نوشتم. توی اون نوشتهها بالاخره تونستم دقیقاً بفهمم مشکل تستهای اولم چی بوده، و این فهم رو به بخشهای وسیعتری از تستنویسی تعمیم دادم. این کتاب حاصل همهی اون تحقیقها، آزمونوخطاها، و تجربههاست—جمعوجور شده، پالایششده، و خلاصهشده.
من از دنیای ریاضی میام و باور دارم که راهنماها تو برنامهنویسی—مثل قضیهها تو ریاضی—باید از اصول پایه دربیان. سعی کردم ساختار این کتاب رو هم همینطوری بچینم: از صفر شروع کنم، بدون نتیجهگیریهای عجولانه یا ادعاهای بیپشتوانه، و قدمبهقدم استدلالم رو بسازم. جالب اینجاست که وقتی این اصول پایهای رو درست بنا کنی، راهنماها و بهترین روشها خودشون بهصورت طبیعی از دلشون درمیاد.
من معتقدم تست واحد داره تبدیل میشه به یه الزام عملی تو پروژههای نرمافزاری، و این کتاب هر چیزی که برای نوشتن تستهای ارزشمند و قابل نگهداری نیاز داری، در اختیارت میذاره.
دربارهی این کتاب
کتاب Unit Testing: Principles, Practices, and Patterns یه نگاه عمیق به بهترین روشها و اشتباهات رایج (anti-patterns) در دنیای تست واحد داره. بعد از خوندن این کتاب، با مهارتهایی که یاد گرفتی، میتونی پروژههایی بسازی که هم موفق باشن، هم راحت نگهداری و توسعه پیدا کنن—و همهی اینها به لطف تستهایی هست که در مسیر ساختشون مینویسی.
این کتاب برای کی مناسبه؟
بیشتر منابعی که تو اینترنت یا کتابها پیدا میکنی یه ایراد دارن:
تمرکزشون فقط روی اصول اولیهی تست واحده و خیلی فراتر نمیرن. البته همین منابع هم ارزش خودشون رو دارن، ولی یادگیری از اونجا تموم نمیشه. یه مرحلهی بعدی هم هست: نه فقط نوشتن تست، بلکه نوشتن تستهایی که واقعاً ارزش وقت و انرژیتو دارن. وقتی به این نقطه از منحنی یادگیری میرسی، معمولاً دیگه کسی راهنماییات نمیکنه و باید خودت راهت رو پیدا کنی.
این کتاب دقیقاً برای همین مرحلهست. یه تعریف علمی و دقیق از تست واحد ایدهآل ارائه میده، تعریفی که تبدیل میشه به یه چارچوب مرجع عمومی برای اینکه بتونی با یه نگاه تازه به تستهات نگاه کنی، بفهمی کدومها واقعاً به پروژه کمک میکنن و کدومها باید بازنویسی یا حذف بشن.
اگه تجربهی زیادی تو تست واحد نداری، چیزهای زیادی از این کتاب یاد میگیری. اگه برنامهنویس باتجربهای هستی، احتمالاً خیلی از مفاهیم این کتاب برات آشناست، ولی این کتاب کمک میکنه بتونی دقیق توضیح بدی که چرا روشهایی که همیشه استفاده میکردی واقعاً مؤثر بودن. و این توانایی رو دستکم نگیر، اینکه بتونی واضح و حرفهای ایدههات رو برای همتیمیهات توضیح بدی، یه مهارت بیقیمت محسوب میشه.
نقشهی راه کتاب
این کتاب ۱۱ فصل داره که به ۴ بخش تقسیم شده.
هر بخش یه مرحله از مسیر یادگیری تست واحد (unit testing) رو پوشش میده—از اصول پایه تا سبکهای پیشرفته و اشتباهات رایج.
بخش اول: آشنایی با تست واحد و مرور اصول کلی
- فصل ۱ هدف تست واحد رو تعریف میکنه و یه دید کلی میده که چطور تست خوب رو از تست بد تشخیص بدیم
- فصل ۲ سراغ تعریف دقیق تست واحد میره و دو مکتب فکری مختلف در تستنویسی رو بررسی میکنه
- فصل ۳ یه مرور کلی روی موضوعات پایه مثل ساختار تستها، استفادهی مجدد از fixtureها، و پارامتردهی تستها داره
بخش دوم: اصل ماجرا—چی باعث میشه یه تست واحد واقعاً خوب باشه؟
- فصل ۴ چهار ستون اصلی تست خوب رو معرفی میکنه و یه چارچوب مرجع مشترک برای کل کتاب میسازه
- فصل ۵ دربارهی mockها صحبت میکنه و نشون میده چطور به شکنندگی تستها مرتبط میشن
- فصل ۶ سه سبک مختلف تستنویسی رو بررسی میکنه و توضیح میده کدوم سبک تستهایی با کیفیت بهتر تولید میکنه و چرا
- فصل ۷ یاد میده چطور تستهای سنگین و پیچیده رو بازنویسی کنیم تا به تستهایی برسیم که با کمترین هزینهی نگهداری، بیشترین ارزش رو تولید میکنن
بخش سوم: تستهای یکپارچهسازی (integration testing)
- فصل ۸ یه نگاه کلی به تستهای یکپارچهسازی میندازه و مزایا و معایبشون رو بررسی میکنه
- فصل ۹ دوباره سراغ mockها میره و توضیح میده چطور میتونن به تستهای یکپارچهسازی کمک کنن
- فصل ۱۰ نحوهی کار با دیتابیسهای رابطهای در تستها رو بررسی میکنه
بخش چهارم: الگوهای اشتباه رایج در تست واحد
- فصل ۱۱ سراغ anti-patternهایی میره که احتمالاً قبلاً باهاشون برخورد داشتی—و کمک میکنه ازشون دوری کنی یا اصلاحشون کنی
دربارهی نویسنده
ولادیمیر خوریکوف (Vladimir Khorikov) مهندس نرمافزار، دارندهی عنوان Microsoft MVP، و مدرس پلتفرم Pluralsight هست. بیش از ۱۵ ساله که بهصورت حرفهای در توسعهی نرمافزار فعالیت میکنه و تو این مدت، تیمهای زیادی رو در زمینهی تست واحد (unit testing) راهنمایی کرده—از مفاهیم پایه گرفته تا نکات ریز و پیشرفته. توی چند سال اخیر، ولادیمیر چندین مجموعهی وبلاگی پرطرفدار و یه دورهی آموزشی آنلاین دربارهی تست واحد منتشر کرده. نکتهای که سبک آموزشیش رو متمایز میکنه—و خیلی از شاگرداش هم بهش اشاره میکنن—اینه که همیشه یه پایهی نظری قوی داره، و بعد اون مفاهیم تئوریک رو با مثالهای عملی ترکیب میکنه تا یادگیری عمیقتر و کاربردیتر بشه.
