کتاب unit testing, principles, practices and patterns نوشتهی Vladimir Khorikov، در زمینه تست نویسی، دید خوبی در این حوزه به من داد. به همین دلیل تصمیم گرفتم در این نوشته به صورت مختصر این کتاب را معرفی کنم. این کتاب به مباحث پایهای مهمی در حوزهی تست نویسی میپردازد. کتاب شامل چهار بخش است و هر بخش شامل چند فصل کوچکتر است.
بخش اول کتاب، دورنمایی از یونیت تست را ارائه میدهد. نویسنده ابتدا به اهداف تست نویسی اشاره کرده و معیارهای پوشش کد و test suit ها را توضیح میدهد و در ادامه در مورد دو رویکرد بحث برانگیز یونیت تست صحبت میکند.
این دو رویکرد classical و London schools نام دارند.
بحث طرفداران این دو رویکرد، بر سر مسئلهی isolation در یونیت تست میباشد.
در رویکرد london schools که mockist نیز نامیده میشود، اگر کلاس X به یک یا چند کلاس دیگر وابستگی داشته باشد، برای تست کلاس X، باید تمامی کلاسهای وابسته mock شوند. در واقع تست هر کلاس باید مستقل از تست کلاسهای دیگر باشد.
ولی در رویکرد classical یا detroit schools، بحث isolation در مورد تستها میباشد و نیازی به mock کردن تمامی وابستگیهای یک کلاس نیست بلکه تنها وابستگیهایی mock میشوند که بین تستها مشترک باشند مانند دیتابیس.
این نویسنده از طرفداران رویکرد classical unit testing میباشد و به نظر او برای نوشتن unit test باید بر روی عملکرد تمرکز کرد، نه چگونگی پیادهسازی کد و در نتیجه نیازی نیست که برای تمامی وابستگیهای یک کلاس، mock تعریف کرد. در این راستا نوع وابستگیها را در کتاب تعریف کرده و نحوهی به کاربردن آنها در یونیت تست را توضیح میدهد.
در ادامهی این بخش، به طور مفصل آناتومی یک یونیت تست را توضیح داده است.
بخش دوم که مهمترین بخش این کتاب به شمار میرود، به توضیح تستهای خوب و باارزش میپردازد.
یکی از نقاط تمرکز این کتاب، بر روی نوشتن تست خوب و توضیح در مورد شکنندگی تستها میباشد. بر اساس این کتاب، یک تست خوب، چهار ویژگی دارد.
با افزون فیچرهای جدید، تست بتواند باگهای احتمالی به وجود آمده در فیچرهای قبلی را پیدا کند.
با ریفکتور کردن کد تحت تست، تستهای مورد نظر نیاز به تغییر نداشته باشند.
تست از سرعت اجرای بالایی برخوردار باشد.
تست قابلیت خوانایی بالا داشته باشد و به راحتی قابل اجرا باشد.
برای باز کردن چنین مبحثی، به دسته بندی و توضیح mock پرداخته و شکنندگی تستها را مورد بررسی قرار داده است. در نهایت نیز انواع مختلف یونیت تست با توجه به چهار اصل بالا را شرح داده است.
در فصل سوم به معرفی integration test پرداخته و در مورد وابستگیهای نیازمند mock شدن در تست به صورت مفصل توضیح داده است. تست دیتابیس نیز از مباحث مهم بیان شده در این فصل است.
در فصل چهارم نیز الگوهای غلط در حوزهی تست نویسی را توضیح میدهد.
از دیدگاه نویسنده لزوما تست نویسی منجر به محصولی با کیفیت و بدون خطا نخواهد شد و پروژههای بسیاری وجود دارند که با وجود داشتن تست، با شکست مواجه شدهاند. یکی از نقاط تمرکز این کتاب، بر روی نوشتن تست خوب است.