CodeShot
Midسختی 3 از ۵· در 66٪ مصاحبه‌های این حوزه پرسیده شده

تفاوت Unit Test و Integration Test چیست و کِی باید هرکدام را نوشت؟

نشان کردن

پاسخ کوتاه

Unit Test یک واحد کد را کاملاً مجزا از وابستگی‌های بیرونی (با Mock/Fake) تست می‌کند؛ Integration Test تعامل واقعی چند جزء (مثلاً کد + دیتابیس واقعی) را بررسی می‌کند.

پاسخ کامل

Unit Test:

  • فقط یک کلاس/متد را تست می‌کند.
  • وابستگی‌های بیرونی (دیتابیس، API، فایل) با Mock/Fake جایگزین می‌شوند.
  • سریع است (میلی‌ثانیه) و می‌تواند صدها بار در دقیقه اجرا شود.

Integration Test:

  • چند جزء واقعی را با هم تست می‌کند — مثلاً یک Repository واقعی روی یک دیتابیس تست (اغلب با Testcontainers).
  • کندتر است اما باگ‌هایی را پیدا می‌کند که Mock‌کردن پنهانشان می‌کند (مثلاً یک Query اشتباه که فقط روی SQL واقعی خطا می‌دهد).

هرم تست (Test Pyramid) توصیه می‌کند: پایه هرم را Unit Testهای زیاد و سریع تشکیل دهند، و Integration/E2E Test در تعداد کمتر، برای مسیرهای حیاتی.

مثال کد

// Unit Test — وابستگی Mock شده
var repoMock = new Mock<IOrderRepository>();
repoMock.Setup(r => r.GetById(1)).Returns(new Order { Id = 1 });
var service = new OrderService(repoMock.Object);

// Integration Test — دیتابیس واقعی (مثلاً با Testcontainers)
using var db = new TestDatabaseFixture();
var repo = new SqlOrderRepository(db.ConnectionString);
var order = await repo.GetById(1);

نکته مهم

منبع کامل موضوع: Unit testing in .NET — Microsoft Learn.

اشتباه رایج

❌ نامیدن تستی که به یک دیتابیس/API واقعی وصل می‌شود «Unit Test» — چنین تستی کند و شکننده است و در دسته Integration Test قرار می‌گیرد.

شرکت‌هایی که این سؤال را پرسیده‌اند

دیجی‌کالا