2
respostas

Preciso criar uma ordem de execução no meus testes.

Tenho um cenario de testes que preciso criar uma ordem de execução, CT01, CT02, CT03....., no NUnit temos a marcação [Test, Order(1)], como posso criar esta ordem no XUnit ?

2 respostas

No XUnit, a ordem de execução dos testes é geralmente considerada uma prática ruim, pois os testes devem ser independentes e executáveis em qualquer ordem. No entanto, se você realmente precisar definir uma ordem específica para seus testes, pode usar o atributo [Collection] juntamente com o atributo [Trait] para agrupar os testes e definir a ordem de execução. Aqui está um exemplo:

Defina uma classe para agrupar os testes que devem ser executados em uma determinada ordem. Vamos chamá-la de OrderTests:

[Collection("OrderTests")]
public class OrderTestCollection
{
}

public class TestClass1
{
    [Fact]
    [Trait("Order", "1")]
    [Trait("Category", "OrderTests")]
    public void CT01()
    {
        // Teste CT01
    }
}

public class TestClass2
{
    [Fact]
    [Trait("Order", "2")]
    [Trait("Category", "OrderTests")]
    public void CT02()
    {
        // Teste CT02
    }
}

public class TestClass3
{
    [Fact]
    [Trait("Order", "3")]
    [Trait("Category", "OrderTests")]
    public void CT03()
    {
        // Teste CT03
    }
}

Agora, você pode criar uma classe de teste separada para executar os testes na ordem desejada:

public class TestRunner
{
    [Fact]
    public void RunTestsInOrder()
    {
        var assembly = typeof(TestRunner).Assembly;
        var testAssembly = new TestAssembly(assembly);
        var testCollectionFactory = new XunitTestCollectionFactory();
        var collectionDefinition = new CollectionDefinition(typeof(OrderTestCollection));
        var testCollection = testCollectionFactory.Get(testAssembly, collectionDefinition);
        var testCases = testCollection.TestCases.OrderBy(tc => tc.Traits.GetValue("Order"));

        foreach (var testCase in testCases)
        {
            testCase.RunAsync(null).Wait();
        }
    }
}

Nesse exemplo, definimos três testes (CT01, CT02 e CT03) em classes separadas. Cada teste possui o atributo [Trait("Order", "...")], onde o valor numérico representa a ordem de execução desejada.

A classe TestRunner é responsável por executar os testes na ordem especificada. Ela obtém a coleção de testes agrupados usando o atributo [Collection] e, em seguida, obtém os casos de teste ordenados pela propriedade "Order" definida nos atributos [Trait]. Em seguida, os casos de teste são executados sequencialmente.

Lembre-se de que essa abordagem viola o princípio de que os testes devem ser independentes e executáveis em qualquer ordem. É altamente recomendado projetar os testes de forma que cada um possa ser executado independentemente e não dependa da ordem de execução para produzir resultados confiáveis.

Boa tarde Rodolfo Ghiggi, estava um tempo fora... Obrigado pela resposta, vou testar...