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 AmaralTeste 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
- Qualidade de Software: Oculte seu códigoQualidade e Testes