Testcontainers (دیتابیس واقعی در Docker) در مقابل دیتابیس In-Memory جعلی (مثل SQLite In-Memory)
Testcontainers یک نمونه واقعی از دیتابیس (مثل SQL Server یا PostgreSQL) را در یک کانتینر Docker موقت برای تست بالا میآورد که رفتار دقیقاً مثل Production است؛ دیتابیس In-Memory جعلی سریعتر است اما موتور متفاوتی دارد و ممکن است برخی رفتارها (مثل قیدهای خاص یا نحوه Query) را دقیق شبیهسازی نکند.
| ویژگی | Testcontainers (دیتابیس واقعی در Docker) | دیتابیس In-Memory جعلی (مثل SQLite In-Memory) |
|---|---|---|
| دقت شبیهسازی Production | بسیار بالا | محدود |
| سرعت اجرا | کندتر (نیاز به Docker) | بسیار سریع |
| نیاز به Docker | بله | خیر |
کِی از Testcontainers (دیتابیس واقعی در Docker) استفاده کنیم؟
وقتی صحت رفتار واقعی دیتابیس (تراکنش، قیدها، Query پیچیده مخصوص SQL Server) برایتان اهمیت دارد و Docker در دسترس است.
کِی از دیتابیس In-Memory جعلی (مثل SQLite In-Memory) استفاده کنیم؟
وقتی سرعت اجرای تستها اولویت اصلی است، Docker در دسترس نیست یا فقط منطق ساده لایه داده را تست میکنید.
مثال Testcontainers (دیتابیس واقعی در Docker)
var container = new MsSqlBuilder().Build();
await container.StartAsync();
var connStr = container.GetConnectionString();
// اتصال واقعی به SQL Server در Docker
مثال دیتابیس In-Memory جعلی (مثل SQLite In-Memory)
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseSqlite("DataSource=:memory:")
.Options;
// سریع ولی موتور SQLite، نه SQL Server واقعی
اشتباه رایج
اشتباه رایج اعتماد کامل به نتیجه تستهای In-Memory برای رفتارهای خاص SQL Server مثل قفلگذاری یا توابع تاریخ است؛ چون SQLite موتور کاملاً متفاوتی دارد، برخی باگها فقط در محیط واقعی (Testcontainers) نمایان میشوند.
جمعبندی
برای تستهای سریع منطق ساده از دیتابیس In-Memory و برای اطمینان از رفتار دقیق دیتابیس واقعی production از Testcontainers استفاده کنید.
