Gerência - Qualidade e Testes
Testes com Visual Studio Team System 2008 - parte II
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 |
- Entendendo o conceito por trás dos processos de Qualidade de SoftwareQualidade e Testes
- Entendendo Indicadores de Prazo e Custo de ProjetosQualidade e Testes
- Aplicação de QUALIDADE de processo de SoftwareQualidade e Testes
- Segurança: Item primordialQualidade e Testes
- TMap Next Test Management Approach - As 4 Essências do TMap Next - Parte 3Qualidade e Testes







