Visão geral do Microsoft IntelliTestOverview of Microsoft IntelliTest

O IntelliTest permite localizar bugs no início e reduz os custos de manutenção de teste.IntelliTest enables you to find bugs early, and reduces test maintenance costs. Usando uma abordagem de teste transparente e automatizada, o IntelliTest pode gerar um conjunto de testes candidato para seu código .NET.Using an automated and transparent testing approach, IntelliTest can generate a candidate suite of tests for your .NET code. A geração de conjunto de testes pode ser ainda mais orientada por propriedades de correção especificadas por você.Test suite generation can be further guided by correctness properties you specify. O IntelliTest até mesmo evoluirá o conjunto de testes automaticamente à medida que o código em teste evolui.IntelliTest will even evolve the test suite automatically as the code under test evolves.

Testes de caracterização O IntelliTest permite que você determine o comportamento do código em termos de um pacote de testes de unidade tradicionais.Characterization tests IntelliTest enables you to determine the behavior of code in terms of a suite of traditional unit tests. Esse conjunto de testes pode ser usado como um pacote de regressão, formando a base para lidar com a complexidade associados à refatoração do código herdado ou desconhecido.Such a test suite can be used as a regression suite, forming the basis for tackling the complexity associated with refactoring legacy or unfamiliar code.

Geração de entrada de teste guiada O IntelliTest usa uma abordagem de resolução de restrição e análise de código aberta para gerar automaticamente valores de entrada de teste precisos, normalmente sem necessidade de intervenção do usuário.Guided test input generation IntelliTest uses an open code analysis and constraint solving approach to automatically generate precise test input values; usually without the need for any user intervention. Para tipos de objeto complexos, ele gera automaticamente as fábricas.For complex object types, it automatically generates factories. Você pode guiar a geração de entrada de teste estendendo e configurando as fábricas para atender aos seus requisitos.You can guide test input generation by extending and configuring the factories to suit your requirements. Propriedades de correção especificadas como declarações no código também serão usadas automaticamente para orientar ainda mais a geração de entrada de teste.Correctness properties specified as assertions in code will also be used automatically to further guide test input generation.

Integração de ISE O IntelliTest está totalmente integrado ao Visual Studio IDE.IDE integration IntelliTest is fully integrated into the Visual Studio IDE. 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 seu status de aprovação ou falha) aparecem no Visual Studio IDE.All of the information gathered during test suite generation (such as the automatically generated inputs, the output from your code, the generated test cases, and their pass or fail status) appears within the Visual Studio IDE. Você pode iterar facilmente entre corrigir seu código e executar novamente o IntelliTest sem sair do Visual Studio IDE.You can easily iterate between fixing your code and rerunning IntelliTest, without leaving the Visual Studio IDE. Os testes podem ser salvos na solução como um Projeto de Teste de Unidade e serão automaticamente detectados posteriormente pelo Gerenciador de Testes do Visual Studio.The tests can be saved into the solution as a Unit Test Project, and will be automatically detected afterwards by Visual Studio Test Explorer.

Complementar práticas de teste existentes Use o IntelliTest para complementar qualquer prática de teste existente que você já esteja seguindo.Complement existing testing practices Use IntelliTest to complement any existing testing practices that you may already follow.

Se desejar testar:If you want to test:

  • Algoritmos através de dados primitivos ou matrizes de dados primitivos:Algorithms over primitive data, or arrays of primitive data:
  • Algoritmos de dados complexos, como o compilador:Algorithms over complex data, such as compiler:
    • permita que o IntelliTest primeiro gere uma representação abstrata dos dados e, em seguida, inseri-a no algoritmolet IntelliTest first generate an abstract representation of the data, and then feed it to the algorithm
    • permita que o IntelliTest crie instâncias usando criação de objeto personalizado e invariáveis de dados e, em seguida, invoque o algoritmolet IntelliTest build instances using custom object creation and data invariants, and then invoke the algorithm
  • Contêineres de dados:Data containers:
  • Uma base de código existente:An existing code base:

O Olá, Mundo do IntelliTestThe Hello World of IntelliTest

O IntelliTest localiza entradas relevantes para o programa testado, o que significa que você pode usá-lo para gerar a famosa cadeia de caracteres Olá, Mundo!IntelliTest finds inputs relevant to the tested program, which means you can use it to generate the famous Hello World! .string. Isso pressupõe que você criou um projeto de teste com base em MSTest do C# e adicionou uma referência ao Microsoft.Pex.Framework.this assumes that you have created a C# MSTest-based test project and added a reference to Microsoft.Pex.Framework. Se você estiver usando uma estrutura de teste diferente, crie uma biblioteca de classes do C# e consulte a documentação da estrutura de teste sobre como configurar o projeto.If you are using a different test framework, create a C# class library and refer to the test framework documentation on how to set up the project.

O exemplo a seguir cria duas restrições no parâmetro chamado valor de forma que o IntelliTest gerará a cadeia de caracteres necessária:The following example creates two constraints on the parameter named value so that IntelliTest will generate the required string:

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 conjunto a seguir:Once compiled and executed, IntelliTest generates a set of tests such as the following set:

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

Leia Gerar testes de unidade para seu código com IntelliTest para entender onde os testes gerados são salvos.Read Generate unit tests with Intellitest to understand where the generated tests are saved. O código de teste gerado deve incluir um teste como o código a seguir:The generated test code should include a test such as the following code:

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

É fácil assim!It's that easy!

LimitaçõesLimitations

Esta seção descreve as limitações do IntelliTest:This section describes the limitations of IntelliTest:

Não determinismoNondeterminism

O IntelliTest pressupõe que o programa analisado é determinístico.IntelliTest assumes that the analyzed program is deterministic. Se não for, o IntelliTest rodará até chegar a um limite de exploração.If it is not, IntelliTest will cycle until it reaches an exploration bound.

O IntelliTest considera um programa como não determinístico se ele depende de entradas que o IntelliTest não pode controlar.IntelliTest considers a program to be non-determistic if it relies on inputs that IntelliTest cannot control.

O IntelliTest controla entradas fornecidas para testes de unidade parametrizados e obtidas de PexChoose.IntelliTest controls inputs provided to parameterized unit tests and obtained from the PexChoose. Nesse sentido, os resultados de chamadas para código não gerenciado ou não instrumentado também são consideradas como "entradas" para o programa instrumentado, mas o IntelliTest não pode controlá-las.In that sense, results of calls to unmanaged or uninstrumented code are also considered as "inputs" to the instrumented program, but IntelliTest cannot control them. Se o fluxo de controle do programa depende de valores específicos provenientes dessas fontes externas, IntelliTest não pode "direcionar" o programa para áreas descobertas anteriormente.If the control flow of the program depends on specific values coming from these external sources, IntelliTest cannot "steer" the program towards previously uncovered areas.

Além disso, o programa é considerado não determinístico se os valores das fontes externas mudam ao executar o programa novamente.In addition, the program is considered to be non-determistic if the values from external sources change when rerunning the program. Em tais casos o IntelliTest perde o controle sobre a execução do programa e a pesquisa se torna ineficiente.In such cases IntelliTest loses control over the execution of the program and its search becomes inefficient.

Às vezes, não é óbvio quando isso acontece.Sometimes it is not obvious when this happens. Considere os exemplos a seguir:Consider the following examples:

  • O resultado do método GetHashCode() é fornecido pelo código não gerenciado e não é previsível.The result of the GetHashCode() method is provided by unmanaged code, and is not predictable.
  • A classe System.Random usa a hora atual do sistema para entregar valores verdadeiramente aleatórios.The System.Random class uses the current system time to deliver truly random values.
  • A classe System.DateTime fornece a hora atual, que não está sob o controle do IntelliTest.The System.DateTime class provides the current time, which is not under the control of IntelliTest.

ConcorrênciaConcurrency

O IntelliTest não trata de programas multithread.IntelliTest does not handle multithreaded programs.

Código nativoNative code

O IntelliTest não entende o código nativo, como instruções x86 chamadas por meio de P/Invoke.IntelliTest does not understand native code, such as x86 instructions called through P/Invoke. Ele não sabe como converter essas chamadas em restrições que podem ser passadas para o solver de restrição.It does not know how to translate such calls into constraints that can be passed to the constraint solver. Mesmo para o código .NET, ele pode analisar somente o código que instrumenta.Even for .NET code, it can only analyze code it instruments. O IntelliTest não pode instrumentar certas partes do mscorlib, incluindo a biblioteca de reflexão.IntelliTest cannot instrument certain parts of mscorlib, including the reflection library. O DynamicMethod não pode ser instrumentado.DynamicMethod cannot be instrumented.

A solução alternativa sugerida é ter um modo de teste em que esses métodos estão localizados em tipos em um assembly dinâmico.The suggested workaround is to have a test mode where such methods are located in types in a dynamic assembly. No entanto, mesmo se alguns métodos não forem instrumentados, o IntelliTest tentará abranger o máximo de código instrumentado possível.However, even if some methods are uninstrumented, IntelliTest will try to cover as much of the instrumented code as possible.

PlataformaPlatform

O IntelliTest tem suporte apenas no .NET Framework X86 de 32 bits.IntelliTest is supported only on the X86, 32-bit .NETframework.

IdiomaLanguage

Em princípio, o IntelliTest pode analisar programas .NET arbitrários, gravados em qualquer linguagem .NET.In principle, IntelliTest can analyze arbitrary .NET programs, written in any .NET language. No entanto, no Visual Studio ele dá suporte apenas a C#.However, in Visual Studio it supports only C#.

Raciocínio simbólicoSymbolic reasoning

O IntelliTest usa um solver de restrições automático para determinar quais valores são relevantes para o teste e o programa em teste.IntelliTest uses an automatic constraint solver to determine which values are relevant for the test and the program under test. No entanto, as habilidades do solver de restrição são, e sempre serão, limitadas.However, the abilities of the constraint solver are, and always will be, limited.

Rastreamentos de pilha incorretosIncorrect stack traces

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.Because IntelliTest catches and "rethrows" exceptions in each instrumented method, the line numbers in stack traces will not be correct. Essa é uma limitação pelo design da instrução "relançar".This is a limitation by design of the "rethrow" instruction.

Leitura adicionalFurther reading