Esse artigo faz parte da revista WebMobile edição 23. Clique aqui para ler todos os artigos desta edição

 

 

ol; mso-bidi-font-weight: bold">·                         O que é um teste unitário;

·                         O que é o Code Coverage;

·                Exemplo prático de desenvolvimento com Code Coverage.

Qual a finalidade

·                Maximizar a qualidade do código através do teste unitário e avaliar possíveis potenciais de falhas e sombras do teste unitário.

Quais situações utilizam esses recursos?

·                Em qualquer desenvolvimento de sistema, utilizando teste unitários, seja web, móbile ou desktop.

 

Resumo do DevMan

         Desenvolver um sistema perfeito é o ideal de todo programador e o sonho de cada cliente. Neste artigo vamos ver como aproximar seu desenvolvimento de um código ideal através de uma análise baseada em exemplos e testes.

         Usaremos NUnit e NCover para efetuar os testes e verificar o quão simples é utilizar-se de testes unitários.

 

Qualidade no desenvolvimento é algo primordial no sucesso de qualquer projeto, mas como garantir que o código entre em produção com o menor número de erros possível? Independente da plataforma, seja .net, Java, ou outras, como detectar rapidamente algum possível defeito de modo que seja possível corrigir rapidamente?

Caso você ainda não conheça, em linhas gerais, testes unitários são métodos que testam trechos de código. Estes métodos de testes nunca serão utilizados diretamente pelo usuário final, porém garantirá que o que foi desenvolvido, está sem erro (ou pelo menos com o menor número de erro possível).

Um dos estilos de programação é o TDD(Test Driven Development). Neste estilo de desenvolvimento recomenda-se fazer o teste unitário antes de desenvolver as classes e métodos, depois rodar os testes. Como as classes e métodos não foram implementados, todos os testes terão falhas.

Depois de desenvolver os métodos necessários, rodam-se os testes novamente e verificamos se o resultado é positivo. Caso o resultado seja negativo, corrigem-se os erros, até obter sucesso em todos os processos.

Muitos já conhecemos e utilizamos testes unitários, porém mesmo com testes unitários existem brechas que podem gerar buraco no código, deixando algum trecho não testado e que provavelmente será descoberto apenas em produção, é a famosa lei de Murphy.

         Neste artigo pretendo mostrar não o que é um teste unitário, mas sim como fazer uma análise do seu teste e como identificar trechos de códigos não testados (sombras), e fazer uma análise através de exemplos de como podemos melhorar a qualidade do código durante o desenvolvimento. Neste artigo utilizei a plataforma .net, porém convido todos os programadores de outras plataformas a lerem este artigo, pois mais do que uma plataforma, pretendo mostrar uma análise de desenvolvimento que possa ser utilizada em qualquer desenvolvimento, seja web, móbile ou desktop, independente da linguagem.

 

Mão na massa!

Vamos supor o seguinte cenário: estamos fazendo um sistema corporativo. Somos os responsáveis pela camada cliente contida neste sistema. Este objeto é o responsável por representar todos os clientes da corporação. Para este desenvolvimento, utilizei o Visual Studio 2005 com VB.NET. Outras versões poderiam ser utilizadas.

Abra então o Visual Studio e crie um projeto de classe. Na Listagem 1, temos um exemplo de uma classe bastante simples. Logo no começo da classe existe uma enumeração com o tipo do cliente. De acordo com a especificação da suposta equipe comercial o cliente pode receber cinco níveis. O primeiro nível é indefinido, ou seja, quando o tipo do cliente não está definido pela equipe comercial. O segundo tipo é um cliente direto, ou seja, quando a empresa fornece diretamente para o cliente. O terceiro tipo é indireto, quando a empresa fornece serviços para o cliente através de uma outra empresa. Neste caso nossa empresa é sub-contratada. O quarto é quando o cliente é um ex-cliente. Por algum tempo possuía algum vínculo com a empresa, mas por algum motivo deixou de ter relacionamento comercial. Por fim temos os prospects. Estes são possíveis futuros clientes.

         Em seguida encontra-se o campo de identificação do cliente (ID). Normalmente é um campo de auto numeração do banco de dados. Definimos também informações cadastrais como Nome, CNPJ, Endereço, Numero, CEP, Identificação do país (PaisID) e identificação da cidade (CidadeID). Como nosso sistema possui uma área de acesso aos clientes (área imaginária) temos um status de ativo. A propriedade ativo recebe um valor booleano de verdadeiro ou falso. Temos também uma propriedade que define o tipo do cliente, de acordo com a enumeração criada no início da Listagem 1.

         No construtor da classe (Linha 134) o método limpar é invocado, para garantir que as propriedades estejam como valor padrão sempre que uma nova instância do cliente é criada. Na linha 145 existe um método chamado validarEmail. Este método utiliza uma expressão regular que valida se o e-mail é válido ou não. Caso seja válido, é retornado um valor True.

         O último método é o da linha 156, chamado calcularNota.  Neste método é atribuída uma nota ao cliente, a formula é 10 sobre o tipo de cliente vezes o retorno mensal que o cliente prove sobre o investimento que a empresa tem com ele. Com este método a suposta equipe comercial consegue priorizar e classificar os melhores clientes. Apesar de bem simples, esta classe nos dá a base que precisamos para a análise.

 

Listagem 1. Classe de cliente cliente.vb

  1 Public Class Cliente

  2 #Region "Propriedades"

  3     Public Enum enumTipoCliente

  4         [Indefinido] = 0

  5         [Direto] = 1

  6         [Indireto] = 2

  7         [ExCliente] = 3

  8         [Prospect] = 4

  9     End Enum

 10     Private m_iID As Integer

 11     Public Property ID() As Integer

 12         Get

 13             Return m_iID

 14         End Get

 15         Set(ByVal value As Integer)

 16             m_iID = value

 17         End Set

 18     End Property

 19     Private m_sNome As String

 20     Public Property Nome() As String

...

Quer ler esse conteúdo completo? Tenha acesso completo