Search code examples
c#unit-testingnunittestcasesource

NUnit: TestCaseSource assigns tests to specific test methods


I'm planning to store all test cases in a excel file with columns indicate test method names, parameters and expected results; however, I found TestCaseSource simply assigns all test cases to every test method. I'm wondering that is there any way I can make NUnit select test cases for methods base on method names I put in the spreadsheet?

Thanks.


Solution

  • There is a way to do this. For example, as you mentioned, you can create a custom attribute.
    The idea is to pass name of test to TestCaseSource.
    You can do it by creating TestCaseSource as separate class.

    First, TestCaseSource class:

    public class SpreadSheetTestCaseSource
    {
        [ThreadStatic] 
        public static string TestName = String.Empty;
    
        public static IEnumerable TestCases
        {
            get
            {
                SpreadSheetTestCaseProvider.GetTestCases()
                     .Where(testCase => testCase.TestName == TestName);
            }
        }
    }
    

    Then attribute:

    public class MyTestCaseSourceAttribute : TestCaseSourceAttribute
    {
        public MyTestCaseSourceAttribute(Type sourceType, string sourceName, 
            [CallerMemberName] string name = null)
            : base(sourceType, sourceName)
        {
            SpreadSheetTestCaseSource.TestName = name;
        }
    
        //Another two members impl.
    }
    

    And test:

    [TestFixture]
    public class TestClass
    {
        [MyTestCaseSource(typeof(SpreadSheetTestCaseSource), "TestCases")]
        public void TestMethod()
        {
            //Test logic
        }
    }
    

    SpeadSheetTestCaseSource.TestName is thread static. So you can run tests parallel.