Testes com Visual
Studio Team System 2008 parte II
Teste Unitário
Neste artigo vamos ver como fazer testes unitários no Visual
Studio Team System. A funcionalidade de testes unitários esta presente nas
edições Test, Development e Suite.
Primeiramente abra o VS e crie um novo projeto do tipo Class
Library, de o nome de Temperaturas:

Altere o nome do arquivo class1.vb criado para
Temperatura.vb. Em seguida adicione o seguinte código:
|
Public Class
Conversao
Public Shared
Function CelsiusParaFahrenheit(ByVal celsius As Decimal)
Return celsius * 1.8
+ 32
End Function
Public Shared
Function FahrenheitParaCelsius(ByVal fahrenheit As
Decimal)
Return
(fahrenheit - 32) / 1.8
End Function
End Class
|
Criamos duas funções simples que convertem temperaturas de
Celsius para Farenheit e de Farenheit para Celsius, até aqui nenhum mistério.
Agora vamos criar um novo projeto de testes para realizar o teste unitário em
nossas funções. Adicione um projeto de testes a solução, de ao novo projeto o
nome de TestaTemperaturas:

Para evitar confusão, apague os arquivos AuthoringTests.txt
(Algumas observações), ManualTest.mht (um teste manual) e UnitTest1.vb (um
teste unitário). Esses arquivos contem alguns exemplos e instruções, podendo
ser apagados sem qualquer efeito na aplicação.

Adicione referencia ao projeto Temperaturas em nosso projeto
de testes. Isto é necessário para que possamos “enxergar” as funções as quais
queremos executar o teste unitário.
Adicione uma nova classe ao projeto Testatemperaturas, de ao
arquivo o nome de TestaTemperaturas.vb:

Agora vamos criar dois testes unitários, um para testar cada
função de conversão que queremos testar:
|
Imports Temperaturas
Imports
Microsoft.VisualStudio.TestTools.UnitTesting
<TestClass()> Public
Class TestaTemperatura
<TestMethod()> Public
Sub TestaCelsiusParaFarenheit()
Dim resultado As Integer = Temperaturas.Conversao.FahrenheitParaCelsius(50)
Assert.AreEqual(resultado,
10)
End Sub
<TestMethod()> Public Sub
TestaFarenheitParaCelsius()
Dim resultado As Integer = Temperaturas.Conversao.CelsiusParaFahrenheit(10)
Assert.AreEqual(resultado,
50)
End Sub
End Class
|
O código inicialmente importa o projeto de temperaturas e o assembly
para testes unitários. A classe TestaTemperatura recebe um atributo TestClass,
este atributo informa que se trata de uma classe de testes. Em seguida temos
dois métodos, que também recebem um atributo: TestMethod, que, como você deve
imaginar, marca os métodos como métodos de teste.
O código dos métodos é simples, primeiramente chamamos a
função de conversão passando a temperatura como parametro, o resultado fica em
uma variavel denominada resultado. Em seguida, chamamos o método
Assert.AreEqual, que recebe dois parametros: o resultado da execução do método,
e o resulda esperado. Se os dois valores conicidirem, o projeto de testes vai entender
que o teste passou.
Vamos agora a execução dos testes. Abra o Test List Editor,
seguindo o caminho da imagem a seguir:

Na janela marque a opção All Loaded Test, para que todos os
testes carregados sejam executados. Note que a direita podemos ver a relação
dos testes disponíveis no projeto, sendo possível selecionar apenas algum teste
específico.

Clique em Run Checked Tests:

O VS roda os testes unitários e apresenta o resultado na
janela TestResults:

Com um duplo clique sobre o resultado, o VS exibe detalhes
do teste:

Nossos dois testes tiveram sucesso. Vamos introduzir um bug
em uma de nossas fórmulas de cálculo para que possamos detectar este bug no
teste unitário:
|
Public Class
Conversao
Public Shared
Function CelsiusParaFahrenheit(ByVal celsius As Decimal)
Return celsius * 1.8 + 23
End Function
Public Shared
Function FahrenheitParaCelsius(ByVal fahrenheit As
Decimal)
Return
(fahrenheit - 32) / 1.8
End Function
End Class
|
Note que na primeira função, alteramos 32 por 23.
Agora, execute novamente seus testes unitários. Veja no
resultado que temos uma falha:

Clique sobre a falha e veja a descrição. Note que em Error
Message, o valor esperado era 41 e o atual foi 50.

Vamos agora ver um recurso interessante, chamado Code
Coverage, que é capaz de mostrar quais linhas de nosso código foram ou não
executadas durante o teste unitário. Primeiramente, vamos alterar uma de nossas
funções para criar um código que não será executado em nosso teste unitário já
criado:
|
Public Class
Conversao
Public Shared
Function CelsiusParaFahrenheit(ByVal celsius As Decimal)
If celsius > 1000 Then
Throw New
Exception("Valor muito elevado!")
End
If
Return
celsius * 1.8 + 23
End Function
Public Shared
Function FahrenheitParaCelsius(ByVal fahrenheit As
Decimal)
Return
(fahrenheit - 32) / 1.8
End Function
End Class
|
Note que a estrutura de decisão vai criar uma exceção se a
temperatura for superior a 1000. Claro que não tem sentido, é apenas para fins
didáticos.
Vamos habilitar a cobertura de código, clique sobre o
arquivo LocalTestRun.testrunconfig:

Localize o item Code Coverage e marque Temperaturas.dll, em
seguida clique em aplicar.

Rode novamente os testes, em seguida, abra a janela Code
Coverage Results:

Nesta janela, clique sobre o botão Show Code Coverage
Coloring:

Em seguida abra o arquivo Temperaturas.vb. Note que o VS
marcou em azul as linhas de código por onde a execução passou, e em vermelho a
linha onde a execução não passou:

Um último assunto: Criamos manualmente nossos testes
unitários. Porém o VS pode automatizar esta tarefa. Se você clicar com o botão
direito sobre o procedimento que deseja criar o teste, verá a opção Create Unit
Tests:

É aberta uma janela com algumas opções, clique em OK:

O VS cria automaticamente a classe e o método de teste,
porém, como o mesmo não sabe o valor esperado para considerar o teste aprovado
ou não, você deve “parametrizar” o código, informando os valores e removendo a
linha que atribui uma situação inconclusiva ao teste. Veja trecho da classe
gerada pelo VS:
|
'''<summary>
'''A test for CelsiusParaFahrenheit
'''</summary>
<TestMethod()> _
Public Sub
CelsiusParaFahrenheitTest()
Dim celsius As [Decimal] = New
[Decimal] ' TODO: Initialize to an appropriate
value
Dim expected As Object = Nothing ' TODO:
Initialize to an appropriate value
Dim
actual As Object
actual
= Conversao.CelsiusParaFahrenheit(celsius)
Assert.AreEqual(expected, actual)
Assert.Inconclusive("Verify
the correctness of this test method.")
End Sub
|