CodeShot

[DataRow] در مقابل [DynamicData]

[DataRow] مقادیر تست پارامتری را مستقیماً و به‌صورت ثابت (Compile-time) روی خود Attribute می‌نویسد و برای تعداد کم داده ساده مناسب است، در حالی که [DynamicData] داده‌ها را در Runtime از یک متد یا Property جداگانه (که می‌تواند شامل انواع پیچیده یا منابع خارجی باشد) می‌خواند.

ویژگی[DataRow][DynamicData]
نوع دادهثابت (Compile-time)پویا (Runtime)
پشتیبانی از اشیاء پیچیدهخیربله
خوانایی برای داده کمبهترپرحجم‌تر

کِی از [DataRow] استفاده کنیم؟

وقتی مقادیر تست ساده، ثابت و کم‌تعداد هستند (اعداد، رشته‌ها) و می‌خواهید مستقیم در کد تست کوتاه بنویسید.

کِی از [DynamicData] استفاده کنیم؟

وقتی داده‌های تست پیچیده (آبجکت، لیست) هستند، باید از منبع مشترکی خوانده شوند یا نیاز به منطق تولید داده در Runtime دارید.

مثال [DataRow]

[TestMethod]
[DataRow(2, 3, 5)]
[DataRow(-1, 1, 0)]
public void Add_ReturnsSum(int a, int b, int expected)
    => Assert.AreEqual(expected, a + b);

مثال [DynamicData]

[TestMethod]
[DynamicData(nameof(GetUsers), DynamicDataSourceType.Method)]
public void Validate_User(User u) => Assert.IsTrue(u.IsValid());

static IEnumerable<object[]> GetUsers() =>
    new[] { new object[] { new User { Name = "Ali" } } };

اشتباه رایج

اشتباه رایج تلاش برای پاس دادن یک شیء پیچیده مستقیم داخل [DataRow] است؛ چون مقادیر آن باید Compile-time constant باشند، این کار خطای کامپایل می‌دهد و باید حتماً از [DynamicData] استفاده شود.

جمع‌بندی

برای مقادیر ساده و ثابت از [DataRow] و برای داده‌های پیچیده یا تولیدشده در Runtime از [DynamicData] استفاده کنید.