Compartilhar via


Gerar testes de unidade para testes de fuzz usando o IntelliTest

O IntelliTest explora seu código .NET para gerar dados de teste e um conjunto de testes de unidade. Para cada instrução no código, uma entrada de teste é gerada que executará essa instrução. Uma análise de caso é executada para cada branch condicional no código. Por exemplo, if instruções, declarações e todas as operações que podem gerar exceções são analisadas. Essa análise é usada para gerar dados de teste para um teste de unidade parametrizado para cada um dos seus métodos, criando testes de unidade com alta cobertura de código. Considere como um teste de fuzz inteligente que refina as entradas e os casos de teste para o que executa todas as ramificações lógicas e detecta exceções.

Ao executar o IntelliTest, você pode ver facilmente quais testes estão falhando e adicionar qualquer código necessário para corrigi-los. Você pode selecionar quais dos testes gerados salvar em um projeto de teste para fornecer um pacote de regressão. À medida que você altera o código, execute Novamente o IntelliTest para manter os testes gerados em sincronia com as alterações de código.

Observação

O IntelliTest foi preterido no Visual Studio 2026. No Visual Studio 2022, o IntelliTest tem suporte apenas para o .NET Framework e é limitado ao Visual Studio Enterprise. O suporte para .NET 6 foi limitado apenas a uma versão prévia.

Observação

No Visual Studio 2022, o IntelliTest tem suporte apenas para o .NET Framework e é limitado ao Visual Studio Enterprise. O suporte para .NET 6 foi limitado apenas a uma versão prévia.

Disponibilidade e extensões

Os comandos de menu Criar IntelliTest e Executar IntelliTest :

  • Estão disponíveis apenas no Enterprise Edition do Visual Studio.

  • Dá suporte apenas ao código C# direcionado ao .NET Framework.

  • São extensíveis e dão suporte à emissão de testes no formato MSTest, MSTest V2, NUnit e xUnit.

  • Não há suporte para a configuração x64 (requer versão prévia).

Explorar: Usar o IntelliTest para explorar seu código e gerar testes de unidade

Para gerar testes de unidade, seus tipos devem ser públicos.

  1. Abra sua solução no Visual Studio e abra o arquivo de classe que tem métodos que você deseja testar.

  2. Clique com o botão direito do mouse em um método e escolha Executar IntelliTest para gerar testes de unidade para o código em seu método.

    Captura de tela do clique com o botão direito do mouse em método para gerar testes de unidade.

    O IntelliTest executa seu código muitas vezes com entradas diferentes. Cada execução é representada na tabela mostrando os dados de teste de entrada e a saída ou exceção resultantes.

    Captura de tela da janela Resultados da Exploração.

Para gerar testes de unidade para todos os métodos públicos em uma classe, basta clicar com o botão direito do mouse na classe em vez de um método específico e, em seguida, escolher Executar IntelliTest. Utilize a lista suspensa na janela Resultados da Exploração para mostrar os testes de unidade e os dados de entrada de cada método na classe.

Captura de tela dos resultados do teste a serem exibidos na lista.

Para testes aprovados, verifique se os resultados relatados na coluna de resultados correspondem às suas expectativas para o código. Para testes que falham, corrija seu código conforme apropriado. Em seguida, execute Novamente o IntelliTest para validar as correções.

Persistir: salvar os testes de unidade como uma suíte de regressão

  1. Selecione as linhas de dados que você deseja salvar com o teste de unidade parametrizado em um projeto de teste.

    Captura de tela de Salvar resultados do teste.

    Você pode exibir o projeto de teste e o teste de unidade parametrizado que foi criado – os testes de unidade individuais, correspondentes a cada uma das linhas, são salvos no arquivo .g.cs no projeto de teste e um teste de unidade parametrizado é salvo em seu arquivo de .cs correspondente. Você pode executar os testes de unidade e exibir os resultados do Gerenciador de Testes da mesma forma que faria para todos os testes de unidade criados manualmente.

    Captura de tela dos testes salvos no Gerenciador de Soluções.

    Todas as referências necessárias também são adicionadas ao projeto de teste.

    Se o código do método for alterado, execute Novamente o IntelliTest para manter os testes de unidade sincronizados com as alterações.

Auxiliar: usar o IntelliTest para concentrar a exploração de código

  1. Se você tiver um código mais complexo, o IntelliTest ajudará você a concentrar a exploração do código. Por exemplo, se você tiver um método que tenha uma interface como parâmetro e houver mais de uma classe que implemente essa interface, o IntelliTest descobrirá essas classes e relatará um aviso.

    Exiba os avisos para decidir o que você deseja fazer.

    Captura de tela dos avisos de exibição.

  2. Depois de investigar o código e entender o que deseja testar, você pode corrigir o aviso para escolher quais classes usar para testar a interface.

    Captura de tela do Aviso de Correção.

    Essa opção é adicionada ao arquivo PexAssemblyInfo.cs .

    [assembly: PexUseType(typeof(Camera))]

  3. Agora você pode executar novamente o IntelliTest para gerar um teste de unidade parametrizado e testar dados usando a classe que você corrigiu.

    Captura de tela de Executar Novamente o IntelliTest após a correção.

Especificar: usar o IntelliTest para validar as propriedades de correção especificadas no código

Especifique a relação geral entre entradas e saídas que você deseja que os testes de unidade gerados validem. Essa especificação é encapsulada em um método que se parece com um método de teste, mas é quantificado universalmente. Esse é o método de teste de unidade parametrizado, e todas as afirmações que você fizer devem se manter para todos os valores de entrada possíveis que o IntelliTest pode gerar.

Perguntas e Respostas

P: Você pode usar o IntelliTest para código não gerenciado?

Um: Não, o IntelliTest só funciona com código gerenciado.

P: Quando um teste gerado é aprovado ou falha?

A: Passa como qualquer outro teste de unidade se não ocorrerem exceções. Ele falha se qualquer asserção falhar ou se o código em teste lançar uma exceção não tratada.

Se você tiver um teste que pode ser bem-sucedido se determinadas exceções forem lançadas, você poderá definir um dos seguintes atributos com base em seus requisitos no método de teste, classe de teste ou nível de montagem.

  • PexAllowedExceptionAttribute

  • PexAllowedExceptionFromTypeAttribute

  • PexAllowedExceptionFromTypeUnderTestAttribute

  • PexAllowedExceptionFromAssemblyAttribute

P: Posso adicionar suposições ao teste de unidade parametrizado?

Um: Sim, usam-se suposições para especificar quais dados de teste não são necessários no teste de unidade de um método específico. Use a PexAssume classe para adicionar suposições. Por exemplo, você pode adicionar uma suposição de que a lengths variável não é nula assim:

PexAssume.IsNotNull(lengths);

Se você adicionar uma suposição e executar novamente o IntelliTest, os dados de teste que não são mais relevantes serão removidos.

P: Posso adicionar asserções ao teste de unidade parametrizado?

Um: Sim, o IntelliTest verificará se o que você está declarando em sua instrução está de fato correto ao executar os testes de unidade. Use a PexAssert classe ou a API de asserção que vem com a estrutura de teste para adicionar asserções. Por exemplo, você pode adicionar uma asserção de que duas variáveis são iguais.

PexAssert.AreEqual(a, b);

Se você adicionar uma declaração e executar novamente o IntelliTest, ele verificará se a declaração é válida e o teste falhará se não for.

P: Posso gerar testes de unidade parametrizados sem executar o IntelliTest primeiro?

Um: Sim, clique com o botão direito do mouse na classe ou método e escolha Criar IntelliTest.

Captura de tela do Create IntelliTest.

Aceite o formato padrão para gerar seus testes ou altere a forma como o projeto e os testes são nomeados. Você pode criar um novo projeto de teste ou salvar seus testes em um projeto existente.

Captura de tela de Criar IntelliTest com o padrão MSTest.

P: Posso usar outras estruturas de teste de unidade com o IntelliTest?

A: Sim, siga estas etapas para encontrar e instalar outros frameworks. As extensões da estrutura de teste também estão disponíveis no Visual Studio Marketplace, por exemplo, gerador de teste NUnit.

Depois de reiniciar o Visual Studio e reabrir a solução, clique com o botão direito do mouse na classe ou método e, em seguida, escolha Criar IntelliTest. Selecione a estrutura instalada aqui:

Captura de tela de Selecionar outra estrutura de teste de unidade para IntelliTest.

Em seguida, execute o IntelliTest para gerar testes de unidade individuais em seus arquivos de .g.cs correspondentes.

P: Posso saber mais sobre como os testes são gerados?

Um: Sim, para obter uma visão geral de alto nível, leia esta postagem no blog.