تست ها دو وضعیت دارن:

یا stateful هستند. یعنی state چیزهایی که دارید تست میکنید قبل و بعد از تست فرق میکنه. مثلا فکر کنید دیتابیس رو ماک نگرفتین و تست بک اند رو یک دور ران کردید رو خود پروژه به صورت مستقیم. اینطوری شما دارین دیتایی به اپلیکیشنتون اضافه میکنید که قبلا نبوده. یعنی state اپلیکیشن شما با هر بار ران شدن تست ها فرق میکنه

و یا stateless هستند. یعنی مثلا شما ۱۰۰ بارم که تست رو ران کنی state اپلیکیشن شما فرقی نمیکنه و همونیه که قبلا بوده.

و تو چند تا کتگوری مختلف هستند که ۴ تاشو اینجا معرفی میکنم:

۱. یونیت تست: به تستی گفته میشه که داره یک یونیت رو تست میکنه. اگه یونیت دیگه ای باشه اون یونیت می بایست ماک شه. مثل ردیس و یک API. اگه قراره API یونیت تست شه پس ردیس باید ماک شه. یونیت تست ها معمولا stateless هستند. معمولا تو مرحله توسعه هر یونیت نوشته میشوند. هر یونیت باید ایزوله شود.

۲. اینتگریشن تست:‌درواقع integration بین ۲ یا چند unit تست میشه. اکثر مواقع stateful هستند ولی میتونند stateless هم باشند. معمولا تو مرحله اتصال دو یونیت به هم نوشته می شوند. مثلا تست میکنید که ایا وقتی یک مسیج produce میکنید تو کافکا ایا کانسومر ران میشه و تسکشو اجرا میکنه؟‌به این میگن integration test.

۳. تست اند تو اند (e2e):‌ کل سیستم تست میشه. اکثر اوقات (خیلی کم پیش میاد اینطور نباشه) stateful هستند. معمولا از دید کاربر سیستم ‍e2e میشود و در آخرین چرخه توسعه قبل از رفتن رو پروداکشن انجام میشود. همچنین قبل از اولین ریلیز اولین بار شروع به توسعه خود تست میشود. برعکس دو مثال بالا که حین توسعه بودند.

۴. اسموک تست:‌تستی که برای بیلد گرفتن اجرا میشود بهش میگن اسموک تست. معمولا از unit test برای اسموک استفاده میشه. از هر تست stateless دیگه ای هم میشه استفاده کرد برای اسموک تست. حواستون باشه نباید از stateful برای اسموک استفاده کرد چون ممکنه به اشتباه تست fail شود (بخاطر تغییر state) و بیلد الکی ریجکت شود. ولی بازم ممکنه یک جاهایی استفاده از تست stateful برای اسموک هم منطقی باشه. ولی تو حالت عادی باید از این کار جلوگیری کرد.