CodeShot

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