در هنگام نوشتن Automation Test برای یک نرم‌افزار، با دیپندنسی‌ها و APIهایی مواجه می‌شیم که ترجیح می‌دیم در هر بار اجرای تست‌ها اون‌ها رو فراخوانی نکنیم. در چنین مواقعی، از Test Double ها استفاده می‌کنیم که انواع متفاوتی دارند و اغلب به اشتباه به همه‌ اون‌ها Mock می‌گیم. اینجا سه نوع رایج Test Double و تفاوت‌هاشون رو توضیح می‌دم.

فیک Fake

این نوع Test Double به عنوان یک جایگزین ساده‌تر، کم‌هزینه‌تر و قابل آزمایش‌تر برای دیپندنسی مورد نظر استفاده می‌شه. Fakeها از همون interfaceهای دیپندنسی اصلی استفاده می‌کنه و اون‌ها رو پیاده‌سازی می‌کنه. مثلاً، فرض کنید می‌خوایم یک شیء رو در دیتابیس بنویسیم و بخونیم. به جای راه‌اندازی یک دیتابیس واقعی برای اجرای هربارهٔ تست‌ها، از یک دیکشنری in memory استفاده می‌کنیم تا وظیفه خوندن و نوشتن داده‌ها رو برامون انجام بده. توی این حالت این دیکشنری وظیفهٔ Fake کردن دیتابیس اصلی رو بر عهده داره.

استاب Stub

بعضاً برای نوشتن یک تست به داده‌های خاصی نیاز داریم. مثلاً فرض کنید که کامپوننتی داریم که مجموع درآمد روزانه رو برای ما حساب می‌کنه. برای این کار به داده‌های درآمدی یک روز نیاز داریم اما می‌تونیم به جای استفاده از داده‌های واقعی، یک Stub داشته باشیم که داده‌هایی که شبیه به داده‌های واقعیه رو تولید کنه تا منطقمون رو بر روی این داده‌ها پیاده‌سازی کنیم. پس به Test Doubleای که وظیفهٔ تولید داده‌ها رو داره Stub می‌گیم.

ماک Mock

گاهی اوقات می‌خوایم رفتار یک دیپندنسی رو بررسی کنیم و نه خروجی و یا پیاده‌سازی اون رو. به طور مثال، ممکنه در یک تست بخوایم تأیید کنیم که یک API خاص فقط یک بار فراخوانی می‌شه و نه بیشتر و نه کمتر. در این مواقع از Mock استفاده می‌کنیم.

مثال عملی

در نوشتهٔ Go Test Doubles by Example به تفصیل در مورد این روش‌ها و تفاوتشون در سطح کد نوشتم و به کمک زبان Golang هر کدوم از این موارد رو پیاده‌سازی کردم و پیشنهاد می‌کنم اون پست رو هم مطالعه کنید.


من بیشتر این یادداشت‌ها رو در کانال تلگرام می‌نویسم و اگر این نوشته رو خوندین احتمالاً باقی نوشته‌های کانال هم به کارتون خواهد اومد و پیشنهاد می‌کنم عضو بشید.