Fala Filhotes! Hoje vou mostrar mais uma utilidade dessa nossa versátil ferramenta. É a criação de Testes de unidade! Não sabe o que é um Teste de unidade? Bom… é um teste simples que tem como objetivo validar os dados de entrada e saída de um método, classe ou ate mesmo um objeto. Resumindo: É um teste para verificar que seu método ( no nosso caso ) está retornando o que ele deveria retornar.
Estou usando o Visual Studio 2010 mas o 2008 também possui essa ferramenta. Vamos ao exemplo então: Tenho um projeto de nome BOL dentro da minha solution com uma classe de nome Employee. Segue a classe abaixo:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BOL { ////// Classe Empregado (didático) /// public class Employee { #region Enums ////// Enum com a função do empregado /// public enum Role { Faxineiro, Gerente, Diretor } #endregion #region Propriedades public int codEmployee { get; set; } public string NameEmployee { get; set; } public Role RoleEmployee { get; set; } public double Salary { get; set; } ////// Retorna a hora extra, que é o salario dividido por 28 vezes 1.5 /// public double HoraExtra { get { return (Salary / 28 * 1.5); } } #endregion #region Construtores public Employee() { } #endregion #region Metodos Estaticos ////// Verifica se o salario do empregado esta adequado com o do mercado /// /// Retorna True se esta e False se não public static bool CheckSalary(Employee empregado) { // // Checa qual o emprego do empregado // Para verificar se o salario é compativel com o do mercado // switch (empregado.RoleEmployee) { case Role.Faxineiro: if (empregado.Salary > 700) return true; break; case Role.Gerente: if (empregado.Salary > 2600) return true; break; case Role.Diretor: if (empregado.Salary > 4000) return true; break; } return false; } ////// Quanto o empregado recebe em 7 dias de serviço /// /// Objeto do tipo Employee public static double GetWeeklyPayment(Employee empregado) { var total = empregado.HoraExtra * 7; // // Retorna o valor total // return total; } #endregion } }
Como você podem ver essa é uma classe simples com 2 métodos estáticos, uma propriedade só de leitura ( Hora Extra ) e o resto de propriedades normais.
Então agora nós iremos criar os testes para esses dois métodos e para nossa propriedade “Hora Extra”.
Mas como isso? Basta clicar em algum lugar dentro da classe Employee e depois em “Create Unit Tests”
Reparem que aparece uma nova tela mostrando os itens da sua classe. Nessa tela você escolhe os métodos/propriedades para quais serão criados os testes de unidade. Então vamos selecionar só os nossos métodos e nossa propriedade “Hora Extra”.
Veja que no Output project você tem a opção de criar um novo projeto de testes, ou se nós tivéssemos, poderíamos usar um projeto já existente. Podemos configurar como será gerado nossa classe de testes clicando em Settings:
Você pode ver que o nome do arquivo e da classe é por padrão o nome da sua classe mais a palavra Test, você pode mudar a nomenclatura da maneira que você quiser. Vamos ver o que cada opção faz:
Mark all test results Inconclusive by default – Se você não modificar os testes que serão gerados, eles iram retornar inconclusivo, isso é uma maneira de mostrar ao programador que ele tem que alterar o teste. (Será dado o exemplo mais abaixo)Enable generation warnings – De acordo com o site da MSDN essa função não está ativa.
Globally qualify all types – Gera as variáveis com o qualificador global ( [namespace].[variável] ) para evitar ambigüidade entre tipos.
Enable documentation comments – Habilita a geração dos comentários para cada método.
Honor InternalsVisibleTo Attribute – Se você marcar essa opção, os métodos marcados como Friend ou Internal serão tratados como métodos públicos.
Lembrando que se você estiver usando o Visual Studio 2008 ou 2005 as opções podem ter nomes diferentes, mas funcionalidades iguais ou parecidas.
Depois de escolher as opções basta apertar OK. E OK na tela de criar os testes.
Se você criou um novo projeto escolha um nome para ele e aperte em Create.
Você pode reparar que um novo projeto de testes foi criado na sua solution com uma classe com o nome que definimos mais acima. Também pode ver que ela criou os métodos de testes que você pediu. Vamos usar o método CheckSalaryTest como exemplo de como o método é:
//////A test for CheckSalary /// [TestMethod()] public void CheckSalaryTest() { Employee empregado = null; // TODO: Initialize to an appropriate value bool expected = false; // TODO: Initialize to an appropriate value bool actual; actual = Employee.CheckSalary(empregado); Assert.AreEqual(expected, actual); Assert.Inconclusive("Verify the correctness of this test method."); }
Perceba os “//TODO ” o visual studio já marcou isso para você saber que você tem que inicializar a variável com algum valor, perceba que por padrão a variável esta nulo. Então nós temos que substituir isso pelo valor a ser testado:
Employee empregado = new Employee { NameEmployee = "Andre", Salary = 800, RoleEmployee = Employee.Role.Faxineiro };
Percebam que existe uma variável com o nome de “expected“ no nosso método de testes, o conteúdo dessa variável deve ser o valor que nós esperamos alcançar. Como assim? Bom, o método que nós vamos chamar não é o CheckSalary? Lembrando, o CheckSalary checa se o meu salário é adequado com o do mercado. Então se mandarmos esse nosso objeto, ele deveria retornar True já que o “André” é um faxineiro e ganha mais que o piso salarial (700) de acordo com o método. Então o valor da variável expected será True. Ótimo! Perceba que o resto do código é a simples execução do método e mais uma comparação do resultado obtido (actual) com o esperado (expected) mas espere, e aquele “Assert.Inconclusive” ? Lembra da configuração que fizemos mais cedo? Se você executar esse teste agora ele retornará como inconclusivo. Basta tirar essa linha e estaremos pronto para ir! Olha como ficou o nosso método depois de toda essa configuração:
//////A test for CheckSalary /// [TestMethod()] public void CheckSalaryTest() { // // Crio um novo empregado para fins de testes // Employee empregado = new Employee { NameEmployee = "Andre", Salary = 800, RoleEmployee = Employee.Role.Faxineiro }; // // O resultado que esperamos é um true // bool expected = true; bool actual; actual = Employee.CheckSalary(empregado); Assert.AreEqual(expected, actual); }
Beleza, mas e agora? Como executamos isso? Vários jeitos… Podemos executar um de cada vez usando esse “botãozinho” ao lado de cada método:
Ou usamos os ícones na nossa toolbar para executar todos os testes de uma vez.
E depois de executar, é só conferir o resultado.
E se falhar:
Simplesmente aperte com o botão direito e “View Test Results Details” para abrir os detalhes juntamente com a exceção que aconteceu:
Existem outras ferramentas do Visual Studio para melhorar a qualidade dos testes, maior informação dos resultados e etc… Mas não pretendo falar sobre eles agora, senão o post iria ficar muito longo e confuso. Então por hoje é isso! E claro, você pode colocar esse projeto de testes no TFS também.
Então, nós vimos que graças ao Visual Studio podemos criar testes de unidade com “meia dúzia” de cliques, algo muito útil na vida de um desenvolvedor.
Espero que vocês tenham gostado, já vou seguir o meu caminho, até mais.
Edit: Alterado o nome de testes unitários para testes de unidade. Dica do @Camiloribeiro. Obrigado!