Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Algoritmos sobre dados primitivos ou matrizes de dados primitivos:
- Algoritmos sobre dados complexos, como o compilador:
- permitir que o IntelliTest primeiro gere uma representação abstrata dos dados e, em seguida, alimente-os para o algoritmo
- permitir que o IntelliTest compile instâncias usando a criação de objetos personalizados e invariáveis de dados e, em seguida, invoque o algoritmo
- Contêineres de dados:
- gravar testes de unidade parametrizados
- permitir que o IntelliTest compile instâncias usando a criação de objetos personalizados e invariáveis de dados e, em seguida, invoque um método do contêiner e verifique novamente invariáveis posteriormente
- escrever testes de unidade parametrizados que chamam diferentes métodos da implementação, dependendo dos valores dos parâmetros
- Uma base de código existente:
- Use o Assistente IntelliTest do Visual Studio para começar gerando um conjunto de PUTs (testes de unidade parametrizados)
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:
- ""
- "\0\0\0\0\0"
- "Olá"
- "\0\0\0\0\0\0"
- "Olá\0"
- "Olá\0\0"
- "Olá\0World!"
- "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:
- Leia esta visão geral na Revista MSDN
Atributos importantes
- PexClass marca um tipo que contém PUT
- PexMethod marca um PUT
- PexAssumeNotNull marca um parâmetro não nulo
using Microsoft.Pex.Framework;
[..., PexClass(typeof(Foo))]
public partial class FooTest {
[PexMethod]
public void Bar([PexAssumeNotNull]Foo target, int i) {
target.Bar(i);
}
}
- PexAssemblyUnderTest associa um projeto de teste a um projeto
- PexInstrumentAssembly especifica um assembly a ser instrumentado
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]
Classes auxiliares estáticas importantes
- PexAssume avalia suposições (filtragem de entrada)
- PexAssert avalia as declarações
- O PexChoose gera novas opções (entradas adicionais)
- O PexObserve registra valores dinâmicos 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 seção descreve as limitações do IntelliTest:
- Nondeterminism
- Simultaneidade
- Código .NET nativo
- Plataforma
- Language
- Raciocínio simbólico
- Rastreamentos de pilha
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".