[TestCase] در مقابل [TestCaseSource]
[TestCase] مقادیر ورودی و خروجی مورد انتظار را مستقیماً و بهصورت ثابت روی خود Attribute مینویسد و برای سناریوهای ساده و کمتعداد کافی است، در حالی که [TestCaseSource] لیست موارد تست را از یک متد، Property یا کلاس جداگانه میخواند و برای دادههای پیچیده، پویا یا قابل استفاده مجدد بین چند تست مناسبتر است.
| ویژگی | [TestCase] | [TestCaseSource] |
|---|---|---|
| محل تعریف داده | روی خود Attribute | متد/Property جداگانه |
| قابلیت استفاده مجدد | محدود | بالا |
| مناسب برای داده پیچیده | خیر | بله |
کِی از [TestCase] استفاده کنیم؟
وقتی چند مقدار ساده عددی یا رشتهای دارید که مستقیم در امضای تست قابل نوشتن هستند.
کِی از [TestCaseSource] استفاده کنیم؟
وقتی دادههای تست پیچیده هستند، باید بین چند کلاس تست به اشتراک گذاشته شوند یا باید در Runtime تولید شوند.
مثال [TestCase]
[TestCase(2, 3, 5)]
[TestCase(-1, 1, 0)]
public void Add_ReturnsSum(int a, int b, int expected)
=> Assert.AreEqual(expected, a + b);
مثال [TestCaseSource]
static object[] Cases =
{
new object[] { 2, 3, 5 },
new object[] { -1, 1, 0 }
};
[TestCaseSource(nameof(Cases))]
public void Add_ReturnsSum(int a, int b, int expected)
=> Assert.AreEqual(expected, a + b);
اشتباه رایج
اشتباه رایج تکرار همان دادههای تست در چند کلاس مختلف با [TestCase] است؛ اگر دادهای بین چند مجموعه تست مشترک است، نگهداری آن با [TestCaseSource] در یک منبع واحد بسیار تمیزتر و کمتکرارتر است.
جمعبندی
برای موارد ساده و کمتعداد از [TestCase] و برای داده پیچیده، پویا یا قابل اشتراک از [TestCaseSource] استفاده کنید.
