[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] استفاده کنید.
