Compartilhar via


Visão geral do Microsoft IntelliTest

O IntelliTest permite que você encontre bugs antecipadamente e reduz os custos de manutenção de teste. Usando uma abordagem de teste automatizada e transparente, o IntelliTest pode gerar um conjunto de testes candidatos para seu código .NET. A geração do conjunto de testes pode ser guiada ainda mais pelas propriedades de correção especificadas. O IntelliTest evoluirá o conjunto de testes automaticamente à medida que o código em teste evoluir.

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.

Testes de caracterização O IntelliTest permite determinar o comportamento do código em termos de um conjunto de testes de unidade tradicionais. Esse conjunto de testes pode ser usado como um pacote de regressão, formando a base para lidar com a complexidade associada à refatoração de código herdado ou desconhecido.

Geração de entrada de teste guiada O IntelliTest usa uma abordagem de resolução de restrições e análise de código aberto para gerar automaticamente valores precisos de entrada de teste; geralmente sem a necessidade de qualquer intervenção do usuário. Para tipos de objeto complexos, ele gera automaticamente fábricas. Você pode orientar a geração de entrada de teste estendendo e configurando as fábricas para atender às suas necessidades. As propriedades de correção especificadas como asserções no código são usadas automaticamente para guiar ainda mais a geração de dados de teste.

Integração do IDE O IntelliTest está totalmente integrado ao IDE do Visual Studio. Todas as informações coletadas durante a geração do conjunto de testes (como as entradas geradas automaticamente, a saída do código, os casos de teste gerados e o status de aprovação ou falha) são exibidas no IDE do Visual Studio. Você pode iterar facilmente entre corrigir seu código e executar novamente o IntelliTest, sem sair do IDE do Visual Studio. Os testes podem ser salvos na solução como um Projeto de Teste de Unidade e são detectados automaticamente posteriormente pelo Gerenciador de Testes do Visual Studio.

Complementar as práticas de teste existentes Use o IntelliTest para complementar todas as práticas de teste existentes que você já possa seguir.

Se você quiser testar:

O Hello World of IntelliTest

IntelliTest encontra entradas relevantes para o programa testado, o que significa que você pode usá-lo para gerar a famosa string Hello World!. Isso pressupõe que você criou um projeto de teste baseado em MSTest em C# e adicionou uma referência ao Microsoft.Pex.Framework. Se você estiver usando uma estrutura de teste diferente, crie uma biblioteca de classes C# e consulte a documentação da estrutura de teste sobre como configurar o projeto.

O exemplo a seguir cria duas restrições no valor nomeado do parâmetro para que o IntelliTest gere a cadeia de caracteres necessária:

using System;
using Microsoft.Pex.Framework;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public partial class HelloWorldTest {
    [PexMethod]
    public void HelloWorld([PexAssumeNotNull]string value) {
        if (value.StartsWith("Hello")
            && value.EndsWith("World!")
            && value.Contains(" "))
            throw new Exception("found it!");
    }
}

Depois de compilado e executado, o IntelliTest gera um conjunto de testes, como o seguinte conjunto:

  1. ""
  2. "\0\0\0\0\0"
  3. "Olá"
  4. "\0\0\0\0\0\0"
  5. "Olá\0"
  6. "Olá\0\0"
  7. "Olá\0World!"
  8. "Olá, Mundo!"

Observação

Para problemas de build, tente substituir as referências Microsoft.VisualStudio.TestPlatform.TestFramework e Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions por uma referência a Microsoft.VisualStudio.QualityTools.UnitTestFramework.

Leia Gerar testes de unidade com o IntelliTest para entender onde os testes gerados são salvos. O código de teste gerado deve incluir um teste, como o seguinte código:

[TestMethod]
[PexGeneratedBy(typeof(global::HelloWorldTest))]
[PexRaisedException(typeof(Exception))]
public void HelloWorldThrowsException167()
{
    this.HelloWorld("Hello World!");
}

É tão fácil assim!

Recursos adicionais:

Atributos importantes

using Microsoft.Pex.Framework;

[..., PexClass(typeof(Foo))]
public partial class FooTest {
    [PexMethod]
    public void Bar([PexAssumeNotNull]Foo target, int i) {
        target.Bar(i);
    }
}
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]

Classes auxiliares estáticas importantes

[PexMethod]
void StaticHelpers(Foo target) {
    PexAssume.IsNotNull(target);

    int i = PexChoose.Value<int>("i");
    string result = target.Bar(i);

    PexObserve.ValueForViewing<string>("result", result);
    PexAssert.IsNotNull(result);
}

Limitações

Esta seção descreve as limitações do IntelliTest:

Nãodeterminismo

O IntelliTest pressupõe que o programa analisado seja determinístico. Se não estiver, o IntelliTest executa ciclos até atingir um limite para exploração.

O IntelliTest considera um programa não determístico se ele depende de entradas que o IntelliTest não pode controlar.

O IntelliTest controla as entradas fornecidas para testes de unidade parametrizados e as entradas obtidas do PexChoose. Nesse sentido, os resultados de chamadas para código não gerenciado ou não gerenciado também são considerados como "entradas" para o programa instrumentado, mas o IntelliTest não pode controlá-los. Se o fluxo de controle do programa depender de valores específicos provenientes dessas fontes externas, o IntelliTest não poderá "direcionar" o programa para áreas descobertas anteriormente.

Além disso, o programa é considerado não determístico se os valores de fontes externas forem alterados ao executar novamente o programa. Nesses casos, o IntelliTest perde o controle sobre a execução do programa e sua pesquisa se torna ineficiente.

Às vezes não é óbvio quando isso acontece. Considere os seguintes exemplos:

  • O resultado do método GetHashCode() é fornecido pelo código não gerenciado e não é previsível.
  • A classe System.Random usa o tempo atual do sistema para fornecer valores verdadeiramente aleatórios.
  • A classe System.DateTime fornece a hora atual, que não está sob o controle do IntelliTest.

Concurrency

O IntelliTest não lida com programas multithreaded.

Código nativo

O IntelliTest não entende o código nativo, como instruções x86 chamadas por meio de P/Invoke. Ele não sabe como converter essas chamadas em restrições que podem ser passadas para o solucionador de restrições. Mesmo para o código .NET, ele só pode analisar o código que ele instrumenta. O IntelliTest não pode instrumentar determinadas partes do mscorlib, incluindo a biblioteca de reflexão. DynamicMethod não pode ser instrumentado.

A solução alternativa sugerida é ter um modo de teste em que esses métodos estejam localizados em tipos em um assembly dinâmico. No entanto, mesmo que alguns métodos não sejam instrumentados, o IntelliTest tentará cobrir o máximo possível do código instrumentado.

Platform

O recurso IntelliTest tem suporte apenas no .NET Framework de 32 bits, X86.

Linguagem

Em princípio, o IntelliTest pode analisar programas .NET arbitrários, escritos em qualquer linguagem .NET. No entanto, no Visual Studio, ele dá suporte apenas a C#.

Raciocínio simbólico

O IntelliTest usa um solucionador de restrição automática para determinar quais valores são relevantes para o teste e o programa em teste. No entanto, as habilidades do solucionador de restrição são, e sempre serão, limitadas.

Rastreamentos de pilha incorretos

Como o IntelliTest captura e "relança" exceções em cada método instrumentado, os números de linha em rastreamentos de pilha não estarão corretos. Essa é uma limitação intencional da instrução "rethrow".