Instruções passo a passo: desenvolvimento de teste antes da codificação com o recurso gerar com base no uso
Este tópico demonstra como usar o recurso Gerar do Uso, que oferece suporte ao desenvolvimento de test-first.
O desenvolvimento test-first é uma abordagem para design de software em que você primeiro escreve testes de unidade baseados nas especificações do produto e, em seguida, escreve o código-fonte que é necessário para tornar os testes bem-sucedidos. O Visual Studio é compatível com o desenvolvimento teste antes da codificação (test-first) através da geração de novos tipos e membros no código-fonte ao referenciá-los pela primeira vez em seus casos de teste antes de serem definidos.
O Visual Studio gera os novos tipos e membros com uma interrupção mínima no seu fluxo de trabalho. Você pode criar stubs para tipos, métodos, propriedades, campos ou construtores sem sair do seu local atual no código. Quando você abre uma caixa de diálogo para especificar as opções para a geração de tipo, o foco retorna imediatamente para o arquivo aberto no momento quando a caixa de diálogo é fechada.
O recurso Gerar com Base no Uso pode ser usado com estruturas de teste integradas ao Visual Studio. A Estrutura de Teste de unidade da Microsoft é demonstrada neste tópico.
Observação
Seu computador pode mostrar diferentes nomes ou locais para alguns dos elementos de interface do usuário do Visual Studio neste artigo. Você pode estar usando outra edição do Visual Studio ou outras configurações de ambiente. Para obter mais informações, confira Personalizar o IDE.
Criar um projeto de Biblioteca de Classes do Windows e um projeto de Teste
Em C# ou no Visual Basic, crie um projeto da Biblioteca de classes do Windows. Nomeie-o
GFUDemo_VB
ouGFUDemo_CS
, dependendo de qual linguagem você está usando.No Gerenciador de Soluções, clique com o botão direito do mouse no ícone da solução na parte superior, escolha Adicionar>Novo Projeto.
Crie um projeto de Teste de Unidade (.NET Framework).
Adicionar uma referência ao projeto de Biblioteca de Classes
No Gerenciador de Soluções, em seu projeto de teste de unidade, clique com o botão direito do mouse na entrada Referências e escolha Adicionar Referência.
Na caixa de diálogo Gerenciador de Referências, selecione Projetos e, em seguida, selecione o projeto da biblioteca de classes.
Escolha OK para fechar a caixa de diálogo Gerenciador de Referências.
Salvar sua solução. Agora você está pronto para começar a escrever testes.
Gerar uma nova classe com base em um teste de unidade
O projeto de teste contém um arquivo chamado UnitTest1. Clique duas vezes neste arquivo no Gerenciador de Soluções para abri-lo no editor de código. Uma classe de teste e um método de teste foram gerados.
Localize a declaração da classe
UnitTest1
e renomeie paraAutomobileTest
.Observação
O IntelliSense agora fornece duas alternativas para o preenchimento de declaração do IntelliSense: modo de preenchimento e modo de sugestão. Use o modo de sugestão para situações nas quais classes e membros são usados antes de serem definidos. Quando uma janela do IntelliSense é aberta, pressione Ctrl+Alt+Espaço para alternar entre o modo de conclusão e o modo de sugestão. Consulte Usar o IntelliSense para obter mais informações. O modo de sugestão ajudará quando você estiver digitando
Automobile
na próxima etapa.Localize o método
TestMethod1()
e renomeie-o paraDefaultAutomobileIsInitializedCorrectly()
. Dentro desse método, crie uma nova instância de uma classe chamadaAutomobile
, conforme mostrado nas capturas de tela a seguir. Um sublinhado ondulado é exibido, indicando um erro em tempo de compilação e uma lâmpada de erro de Ações Rápidas aparece na margem esquerda ou diretamente abaixo do rabisco, se você passa o mouse sobre ele.Escolha ou clique na lâmpada Ações Rápidas. Você verá uma mensagem de erro afirmando que o tipo
Automobile
não está definido. Você também verá algumas possíveis soluções.Clique em Gerar novo tipo para abrir a caixa de diálogo Gerar Tipo. Essa caixa de diálogo fornece opções que incluem a geração de tipo em um projeto diferente.
Na lista Projeto, clique em GFUDemo_VB ou GFUDemo_CS para instruir o Visual Studio a adicionar o arquivo ao projeto de biblioteca de classes em vez do projeto de teste. Se ainda não estiver selecionado, escolha Criar novo arquivo e nomeie-o Automobile.cs ou Automobile.vb.
Clique em OK para fechar a caixa de diálogo e criar o novo arquivo.
No Gerenciador de Soluções, procure no nó de projeto GFUDemo_VB ou GFUDemo_CS para verificar se o novo arquivo Automobile.vb ou Automobile.cs está nesse local. No editor de código, o foco ainda estará em
AutomobileTest.DefaultAutomobileIsInitializedCorrectly
, o que permite que você continue a escrever o teste com um mínimo de interrupção.
Gerar um stub de propriedade
Suponha que a especificação de produto afirma que a classe Automobile
tem duas propriedades públicas chamadas Model
e TopSpeed
. Essas propriedades devem ser inicializadas com valores padrão de "Not specified"
e -1
pelo construtor padrão. O seguinte teste de unidade verificará para que o construtor padrão defina as propriedades para seus valores padrão corretos.
Adicione a seguinte linha de código no método de teste
DefaultAutomobileIsInitializedCorrectly
.Com o código faz referência a duas propriedades indefinidas em
Automobile
, um sublinhado ondulado aparecerá sobModel
eTopSpeed
. Passe o mouse sobreModel
, escolha a lâmpada de erro Ações Rápidas e, em seguida, escolha Gerar propriedade 'Automobile.Model'.Gere um stub de propriedade para a propriedade
TopSpeed
da mesma maneira.Na classe
Automobile
, os tipos das novas propriedades são inferidos corretamente do contexto.
Gerar um stub para um novo construtor
Agora vamos criar um método de teste que gerará um stub de construtor para inicializar as propriedades Model
e TopSpeed
. Depois, você adicionará mais código para concluir o teste.
Adicione também o seguinte método de teste à sua classe
AutomobileTest
.Clique na lâmpada de erro Ações Rápidas sob a linha ondulada vermelha e, em seguida, clique em Gerar construtor em 'Automobile'.
No arquivo de classe
Automobile
, observe que o novo construtor examinou os nomes das variáveis locais que são usadas na chamada do construtor, encontrou propriedades que têm os mesmos nomes na classeAutomobile
e forneceu código no corpo do construtor para armazenar os valores de argumento nas propriedadesModel
eTopSpeed
.Depois de gerar o novo construtor, um sublinhado ondulado aparece sob a chamada para o construtor padrão em
DefaultAutomobileIsInitializedCorrectly
. A mensagem de erro informa que a classeAutomobile
não tem nenhum construtor que assuma zero argumentos. Para gerar um construtor padrão explícito que não tem parâmetros, clique na lâmpada de erro Ações Rápidas e, em seguida, clique em Gerar construtor em 'Automobile'.
Gerar um stub para um método
Suponha que a especificação afirme que um novo Automobile
poderá ser colocado em um estado IsRunning
se suas propriedades Model
e TopSpeed
forem definidas como algo diferente dos valores padrão.
Adicione as seguintes linhas ao método
AutomobileWithModelNameCanStart
.Clique na lâmpada de erro Ações Rápidas para a chamada de método
myAuto.Start
e, em seguida, clique em Gerar método 'Automobile.Start'.Clique na lâmpada Ações Rápidas para a propriedade
IsRunning
e, em seguida, clique em Gerar propriedade 'Automobile.IsRunning'.Agora a classe
Automobile
contém um método chamadoStart()
e uma propriedade chamadaIsRunning
.
Executar os testes
No menu Teste, escolha Executar>Todos os Testes.
O comando Executar>Todos os Testes executa todos os testes nas estruturas de teste escritas para a solução atual. Nesse caso, há dois testes e ambos falham conforme o esperado. O teste
DefaultAutomobileIsInitializedCorrectly
falha porque a condiçãoAssert.IsTrue
retornaFalse
. O testeAutomobileWithModelNameCanStart
falha porque o métodoStart
na classeAutomobile
lança uma exceção.A janela Resultados do Teste é mostrada na ilustração a seguir.
Na janela Resultados de Teste, clique duas vezes em cada linha de resultado do teste para ir até o local de cada teste.
Implementar o código-fonte
Adicione o seguinte código ao construtor padrão, de maneira que as propriedades
Model
,TopSpeed
eIsRunning
sejam inicializadas com seus valores padrão corretos,"Not specified"
,-1
eFalse
(oufalse
para o C#).Quando o método
Start
é chamado, ele deve definir o sinalizadorIsRunning
como true apenas se as propriedadesModel
ouTopSpeed
estiverem definidas com valor diferente de seu valor padrão. Remova oNotImplementedException
do corpo do método e adicione o código a seguir.
Executar os testes novamente
No menu Testar, aponte para Executar e, em seguida, clique em Todos os Testes.
Dessa vez os testes são aprovados. A janela Resultados do Teste é mostrada na ilustração a seguir.