Gerência - Qualidade e Testes

Testes com Visual Studio Team System 2008 - parte II

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.

por Fernando Amaral



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

Fernando Amaral

Fernando Amaral - Certificado PMP pelo PMI, CDIA+ pela CompTia, MCP, MCAD, MCSD, MCDBA, MCT pela Microsoft. Pós Graduado em Gestão de Sistemas de Informação (UNIDERP) e Melhoria em Processos de Software (UFLA). Atualmente reside em Campo Grande, MS, onde presta consultoria, treinamentos e palestras na área de TI.
Blog:
http://www.fernandoamaral.com.br.