How to set the test case sequence in xUnit

前端 未结 4 1218
温柔的废话
温柔的废话 2020-12-05 12:59

I have written the xUnit test cases in C#. That test class contains so many methods. I need to run the whole test cases in a sequence. How can I set the test case sequence

4条回答
  •  Happy的楠姐
    2020-12-05 13:44

    In xUnit 2.* this can be achieved using the TestCaseOrderer attribute to designate an ordering strategy, which can be used to reference an attribute that is annotated on each test to denote an order.

    For example:

    Ordering Strategy

    [assembly: CollectionBehavior(DisableTestParallelization = true)] 
    
    public class PriorityOrderer : ITestCaseOrderer
    {
        public IEnumerable OrderTestCases(IEnumerable testCases) where TTestCase : ITestCase
        {
            var sortedMethods = new SortedDictionary>();
    
            foreach (TTestCase testCase in testCases)
            {
                int priority = 0;
    
                foreach (IAttributeInfo attr in testCase.TestMethod.Method.GetCustomAttributes((typeof(TestPriorityAttribute).AssemblyQualifiedName)))
                    priority = attr.GetNamedArgument("Priority");
    
                GetOrCreate(sortedMethods, priority).Add(testCase);
            }
    
            foreach (var list in sortedMethods.Keys.Select(priority => sortedMethods[priority]))
            {
                list.Sort((x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.TestMethod.Method.Name, y.TestMethod.Method.Name));
                foreach (TTestCase testCase in list)
                    yield return testCase;
            }
        }
    
        static TValue GetOrCreate(IDictionary dictionary, TKey key) where TValue : new()
        {
            TValue result;
    
            if (dictionary.TryGetValue(key, out result)) return result;
    
            result = new TValue();
            dictionary[key] = result;
    
            return result;
        }
    }
    

    Attribute

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class TestPriorityAttribute : Attribute
    {
        public TestPriorityAttribute(int priority)
        {
            Priority = priority;
        }
    
        public int Priority { get; private set; }
    }
    

    Test Cases

    [TestCaseOrderer("FullNameOfOrderStrategyHere", "OrderStrategyAssemblyName")]
    public class PriorityOrderExamples
    {
        [Fact, TestPriority(5)]
        public void Test3()
        {
            // called third
        }
    
        [Fact, TestPriority(0)]
        public void Test2()
        {
          // called second
        }
    
        [Fact, TestPriority(-5)]
        public void Test1()
        {
           // called first
        }
    
    }
    

    xUnit 2.* ordering samples here

提交回复
热议问题