CodeShot

تست یکپارچگی درون‌پروسه‌ای (In-Process) در مقابل تست یکپارچگی برون‌پروسه‌ای (Out-of-Process)

تست درون‌پروسه‌ای با ابزاری مثل WebApplicationFactory برنامه را در حافظه همان پروسه تست میزبانی می‌کند و درخواست‌های HTTP را بدون شبکه واقعی شبیه‌سازی می‌کند، در حالی که تست برون‌پروسه‌ای یک نمونه واقعی از برنامه را (مثلاً روی یک پورت واقعی یا در Docker) اجرا کرده و با HttpClient واقعی از بیرون به آن درخواست می‌زند.

ویژگیتست یکپارچگی درون‌پروسه‌ای (In-Process)تست یکپارچگی برون‌پروسه‌ای (Out-of-Process)
سرعت اجراسریعکندتر
نیاز به شبکه/پورت واقعیخیربله
دسترسی به DI Container برنامهکاملندارد

کِی از تست یکپارچگی درون‌پروسه‌ای (In-Process) استفاده کنیم؟

وقتی می‌خواهید تست‌های سریع و پایدار بدون وابستگی به شبکه و پورت داشته باشید و دسترسی به DI Container برنامه برای Override کردن سرویس‌ها لازم دارید.

کِی از تست یکپارچگی برون‌پروسه‌ای (Out-of-Process) استفاده کنیم؟

وقتی می‌خواهید رفتار واقعی زیرساخت (مثل تنظیمات Kestrel، Middleware شبکه، یا تعامل چند سرویس واقعی) را دقیقاً همان‌طور که در Production است بسنجید.

مثال تست یکپارچگی درون‌پروسه‌ای (In-Process)

public class ApiTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly HttpClient _client;
    public ApiTests(WebApplicationFactory<Program> f)
        => _client = f.CreateClient();
}

مثال تست یکپارچگی برون‌پروسه‌ای (Out-of-Process)

# اجرای واقعی برنامه روی یک پورت
dotnet run --urls http://localhost:5050 &
curl http://localhost:5050/api/health

اشتباه رایج

اشتباه رایج فرض کردن این است که تست‌های In-Process با WebApplicationFactory دقیقاً معادل رفتار Production هستند؛ برخی جزئیات مثل تنظیمات واقعی Kestrel، HTTPS یا Reverse Proxy فقط در تست برون‌پروسه‌ای واقعی قابل بررسی‌اند.

جمع‌بندی

برای اکثر تست‌های یکپارچگی سریع و پایدار از رویکرد In-Process و برای اطمینان نهایی از رفتار واقعی زیرساخت پیش از انتشار از تست برون‌پروسه‌ای استفاده کنید.