Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
- Algoritmos sobre dados primitivos ou matrizes de dados primitivos:
- escrever testes de unidade parametrizados
- Algoritmos sobre dados complexos, como compilador:
- deixe o IntelliTest primeiro gerar uma representação abstrata dos dados e, em seguida, alimentá-la para o algoritmo
- permitir que o IntelliTest crie instâncias usando a criação de objetos personalizados e invariantes de dados e, em seguida, invoque o algoritmo
- Contentores de dados:
- escrever testes de unidade parametrizados
- deixe o IntelliTest criar instâncias usando a criação de objetos personalizados e invariantes de dados e, em seguida, invoque um método do contêiner e verifique novamente os invariantes depois
- 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 testes de unidade parametrizados (PUTs)
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:
- ""
- "\0\0\0\0\0"
- "Olá"
- "\0\0\0\0\0\0"
- "Olá\0"
- "Olá\0\0"
- "Olá\0Mundo!"
- "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:
- Leia esta visão geral na MSDN Magazine
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 vincula um projeto de teste a um projeto
- PexInstrumentAssembly especifica uma montagem para instrumento
[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
- Simultaneidade
- Código .NET nativo
- Plataforma
- Language
- Raciocínio simbólico
- Traces de pilha
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".