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 قرار میگیرد.
شرکتهایی که این سؤال را پرسیدهاند
دیجیکالا
