Partilhar via


Visão geral do Microsoft IntelliTest

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

Observação

O IntelliTest foi preterido no Visual Studio 2026. No Visual Studio 2022, o IntelliTest é suportado apenas para o .NET Framework e está limitado ao Visual Studio Enterprise. O suporte para o .NET 6 foi limitado apenas a uma versão de pré-visualização.

Observação

No Visual Studio 2022, o IntelliTest é suportado apenas para o .NET Framework e está limitado ao Visual Studio Enterprise. O suporte para o .NET 6 foi limitado apenas a uma versão de pré-visualização.

Ensaios 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 conjunto 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 utiliza uma abordagem de análise de código aberto e resolução de restrições para gerar automaticamente valores de entrada de teste precisos; geralmente sem a necessidade de qualquer intervenção do usuário. Para tipos de objetos complexos, ele gera fábricas automaticamente. Você pode orientar a geração de entrada de teste estendendo e configurando as fábricas para atender às suas necessidades. As propriedades de corretude especificadas como asserções no código são usadas automaticamente para continuar a orientar a geração de entrada de teste.

Integração IDE O IntelliTest está totalmente integrado no 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 seu código, os casos de teste gerados e seu status de aprovação ou reprovação) aparecem no IDE do Visual Studio. Você pode facilmente iterar 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 detetados automaticamente posteriormente pelo Visual Studio Test Explorer.

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

Se quiser testar:

O Olá Mundo do IntelliTest

O IntelliTest encontra entradas relevantes para o programa testado, o que significa que pode usá-lo para gerar a famosa cadeia de caracteres Hello World! . Isso pressupõe que você tenha criado um projeto de teste baseado em C# MSTest e adicionado uma referência a 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 parâmetro named value para que 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!");
    }
}

Uma vez 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á\0Mundo!"
  8. "Olá Mundo!"

Observação

Para problemas de compilação, 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!");
}

É muito fácil!

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

  • PexAssume avalia suposições (filtragem de entrada)
  • PexAssert avalia asserções
  • PexChoose gera novas opções (entradas adicionais)
  • O PexObserve registra valores em tempo real nos testes gerados
[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 secção descreve as limitações do IntelliTest:

Não-determinismo

O IntelliTest assume que o programa analisado é determinístico. Se não estiver, o IntelliTest alterna até atingir um limite de exploração.

O IntelliTest considera um programa não determístico se depender de entradas que o IntelliTest não consegue controlar.

O IntelliTest controla as entradas fornecidas para testes unitários parametrizados e obtidas a partir do PexChoose. Nesse sentido, os resultados de chamadas para código não gerenciado ou não instrumentado 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 depende de valores específicos provenientes dessas fontes externas, o IntelliTest não pode "direcionar" o programa para áreas descobertas anteriormente.

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

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

  • O resultado do método GetHashCode() é fornecido por 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 compreende código nativo, como instruções x86 chamadas através de P/Invoke. Ele não sabe como traduzir tais chamadas em restrições que podem ser passadas para o solucionador de restrições. Mesmo para o código .NET, só é possível analisar o código que ele instrumenta. O IntelliTest não pode instrumentar certas partes do mscorlib, incluindo a biblioteca de reflexão. DynamicMethod não pode ser instrumentado.

A solução sugerida é ter um modo de teste onde esses métodos estão localizados em tipos em uma montagem dinâmica. No entanto, mesmo que alguns métodos não sejam instrumentados, o IntelliTest tenta cobrir o máximo possível do código instrumentado.

Platform

IntelliTest é suportado apenas no X86, 32-bit . NETframework.

Linguagem

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

Raciocínio simbólico

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

Rastreamentos de pilha incorretos

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