Подтвердить что ты не робот

Как установить последовательность тестовых примеров в xUnit

Я написал тестовые примеры xUnit в С#. Этот тестовый класс содержит так много методов. Мне нужно запустить все тестовые примеры в последовательности. Как установить последовательность тестовых примеров в xUnit?

4b9b3361

Ответ 1

В xUnit 2. * это может быть достигнуто с помощью атрибута TestCaseOrderer для обозначения стратегии упорядочения, которая может использоваться для ссылки на атрибут, который аннотируется в каждом тесте для обозначения порядка.

Например:

Стратегия заказа

[assembly: CollectionBehavior(DisableTestParallelization = true)] 

public class PriorityOrderer : ITestCaseOrderer
{
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase
    {
        var sortedMethods = new SortedDictionary<int, List<TTestCase>>();

        foreach (TTestCase testCase in testCases)
        {
            int priority = 0;

            foreach (IAttributeInfo attr in testCase.TestMethod.Method.GetCustomAttributes((typeof(TestPriorityAttribute).AssemblyQualifiedName)))
                priority = attr.GetNamedArgument<int>("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<TKey, TValue>(IDictionary<TKey, TValue> dictionary, TKey key) where TValue : new()
    {
        TValue result;

        if (dictionary.TryGetValue(key, out result)) return result;

        result = new TValue();
        dictionary[key] = result;

        return result;
    }
}

атрибут

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

    public int Priority { get; private set; }
}

Тестовые случаи

[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. * заказ образцов здесь

Ответ 2

Тестовый приоритет: внизу этой страницы.

[PrioritizedFixture]
public class MyTests
{
    [Fact, TestPriority(1)]
    public void FirstTest()
    {
        // Test code here is always run first
    }
    [Fact, TestPriority(2)]
    public void SeccondTest()
    {
        // Test code here is run second
    }
}

Кстати, у меня сейчас такая же проблема. И да, это не чистое искусство... но QA хотел провести ручной тест... поэтому автоматизированный тест с определенным заказом уже является для них большим скачком... (кашляет) и да, это не совсем модульное тестирование..

Ответ 3

Вы не можете, по дизайну. Он преднамеренно случайен, чтобы не допустить, чтобы кто-либо получал один из них либо по желанию, либо случайно.

Случайность определяется только для заданного класса Test, поэтому вы можете достичь своих целей, обернув элементы, которые вы хотите контролировать порядок внутри вложенного класса, но в этом случае вы все равно получите случайные если у вас более двух методов тестирования в классе.

Если вы пытаетесь управлять наращиванием светильников или контекста, может оказаться целесообразным встроенный механизм IUseFixture<T>. Для примера см. xUnit Cheat Sheet.

Но вам действительно нужно рассказать нам больше о том, что вы пытаетесь сделать, или нам просто нужно получить спекулятивный характер.

Ответ 5

Если вам действительно нужно расставить приоритеты в своих тестах (возможно, не в модульных тестах), вы можете использовать Xunit.Priority. Я использовал его для некоторого интеграционного тестирования и работает очень хорошо и просто, без необходимости писать классы приоритетов для простых сценариев.