Как заказать тесты xUnit, принадлежащие одной коллекции тестов, но распределенные по нескольким классам тестов? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть несколько методов тестирования, которые распределены по нескольким классам тестов, но относятся к одной коллекции тестов. Я использую ITestCaseOrderer, предоставленный xUnit, но он заказывает только методы тестирования в отдельных классах тестирования.

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

    public int Priority { get; }
}

Я реализовал мой приоритетный заказ следующим образом.

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

        foreach (var testCase in testCases)
        {
            var attributeInfo = testCase.TestMethod.Method.GetCustomAttributes(typeof(TestPriorityAttribute).AssemblyQualifiedName)
                .SingleOrDefault();
            if (attributeInfo != null)
            {
                var priority = attributeInfo.GetNamedArgument<int>("Priority");
                sortedMethods.Add(priority, testCase);
            }
        }

        return sortedMethods.OrderBy(x => x.Key).Select(x => x.Value);
    }
}

Мой первый тестовый класс выглядит следующим образом.

[TestCaseOrderer("Integration.Tests.PriorityOrderer", "CompanyName.ProjectName.Integration.Tests")]
[Collection("StandardIntegrationTests")]
[Trait("Category", "Integration")]
public class StandardControllerTests1
{
    public StandardControllerTests1(StandardIntegrationTestFixture standardIntegrationTestFixture)
    {

    }

    [Fact, TestPriority(1)]
    public void TestMethod1()
    {
    }

    [Fact, TestPriority(2)]
    public void TestMethod2()
    {
    }
}

Мой второй тестовый класс выглядит так

[TestCaseOrderer("Integration.Tests.PriorityOrderer", "CompanyName.ProjectName.Integration.Tests")]
[Collection("StandardIntegrationTests")]
[Trait("Category", "Integration")]
public class StandardControllerTests2
{
    public StandardControllerTests2(StandardIntegrationTestFixture standardIntegrationTestFixture)
    {

    }

    [Fact, TestPriority(3)]
    public void TestMethod3()
    {
    }

    [Fact, TestPriority(4)]
    public void TestMethod4()
    {
    }
}

У меня есть и другие тестовые классы, которые принадлежат к той же тестовой коллекции. Когда я запускаю тесты, это не порядок в коллекции. Как заказать выполнение этих тестов в порядке, указанном в одной коллекции?

1 Ответ

0 голосов
/ 10 октября 2018

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

В соответствии с проблемой 898 на плате xUnit упорядочение по классам в одной коллекции в настоящее время невозможно.

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

[Trait("Order", "")]   
[TestCaseOrderer(DependencyOrderer.TypeName, DependencyOrderer.AssemblyName)]
public partial class OrderTests
{
    [Fact]        
    public void Test0()
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }

    [Fact]
    [TestDependency("Test1", "Test0")]
    public void Test3()
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
 }

[Trait("Order", "")]
public partial class OrderTests
{
    [Fact]
    public void Test2()
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));            
    }

    [Fact]
    [TestDependency("Test0")]
    public void Test1()
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...