Existe algum meio no framework xUnit.net semelhante aos seguintes recursos do NUnit?
[Test, TestCaseSource("CurrencySamples")]
public void Format_Currency(decimal value, string expected){}
static object[][] CurrencySamples = new object[][]
{
new object[]{ 0m, "0,00"},
new object[]{ 0.0004m, "0,00"},
new object[]{ 5m, "5,00"},
new object[]{ 5.1m, "5,10"},
new object[]{ 5.12m, "5,12"},
new object[]{ 5.1234m, "5,12"},
new object[]{ 5.1250m, "5,13"}, // round
new object[]{ 5.1299m, "5,13"}, // round
}
Isso irá gerar 8 testes separados no NUnit GUI
[TestCase((string)null, Result = "1")]
[TestCase("", Result = "1")]
[TestCase(" ", Result = "1")]
[TestCase("1", Result = "2")]
[TestCase(" 1 ", Result = "2")]
public string IncrementDocNumber(string lastNum) { return "some"; }
Isso irá gerar 5 testes separados e comparar automaticamente os resultados ( Assert.Equal()
).
[Test]
public void StateTest(
[Values(1, 10)]
int input,
[Values(State.Initial, State.Rejected, State.Stopped)]
DocumentType docType
){}
Isso irá gerar 6 testes combinatórios. Impagável.
Há alguns anos, experimentei o xUnit e adorei, mas faltava-lhe esses recursos. Não posso viver sem eles. Algo mudou?
Respostas:
O xUnit oferece uma maneira de executar testes parametrizados por meio de algo chamado teorias de dados . O conceito é equivalente ao encontrado no NUnit, mas a funcionalidade que você tira da caixa não é tão completa.
Aqui está um exemplo:
Neste exemplo, o xUnit executará o
Should_format_the_currency_value_correctly
teste uma vez aInlineDataAttribute
cada vez, passando o valor especificado como argumento.Teorias de dados são um ponto de extensibilidade que você pode usar para criar novas maneiras de executar seus testes parametrizados. A maneira como isso é feito é criando novos atributos que inspecionam e, opcionalmente, atuam sobre os argumentos e o valor de retorno dos métodos de teste.
Você pode encontrar um bom exemplo prático de como teorias de dados do xUnit pode ser estendido em AutoFixture 's Autodata e InlineAutoData teorias.
fonte
[Theory]
atributo não estará disponível.Deixe-me jogar mais uma amostra aqui, apenas no caso de economizar algum tempo para alguém.
fonte
Em sua primeira solicitação, você pode seguir os exemplos encontrados aqui .
Você pode construir uma classe estática contendo os dados necessários para uma coleção de testes
Em seguida, usando o atributo MemberData, defina o teste como tal
ou se você estiver usando C # 6.0,
O primeiro argumento de MemberDataAttribute permite definir o membro a ser usado como fonte de dados, para que você tenha bastante flexibilidade na reutilização.
fonte
De acordo com este artigo no xUnit, você tem três opções de "parametrização":
Exemplo de InlineData
Exemplo de ClassData
Exemplo MemberData
fonte
Encontrei uma biblioteca que produz funcionalidade equivalente ao
[Values]
atributo do NUnit, chamada Xunit.Combinatorial :Ele permite que você especifique valores em nível de parâmetro:
Ou você pode implicitamente fazer com que ele descubra o número mínimo de invocações para cobrir todas as combinações possíveis:
fonte
Aceitei todas as respostas aqui e, adicionalmente, usei os
TheoryData<,>
tipos genéricos de XUnit para me fornecer definições de dados simples, fáceis de ler e digitar seguras para o atributo 'MemberData' em meu teste, conforme este exemplo:NB usando VS2017 (15.3.3), C # 7 e XUnit 2.2.0 para .NET Core
fonte