Como realizar teste unitário em Excel VBA

0
Teste unitário Excel VBA

Como realizar teste unitário em Excel VBA

A realização de teste unitário em qualquer software é algo que deveria ser realizado com frequência, mas não é o que tenho visto nestes anos de programação. Neste artigo é demonstrado como realizar testes unitários em Excel VBA.

O que é teste de software?

Teste de software é o processo de execução de um produto para determinar se ele atingiu suas especificações e funcionou corretamente no ambiente para o qual foi projetado. O seu objetivo é revelar falhas em um produto, para que as causas dessas falhas sejam identificadas e possam ser corrigidas pela equipe de desenvolvimento antes da entrega final. Por conta dessa característica das atividades de teste, dizemos que sua natureza é “destrutiva”, e não “construtiva”, pois visa ao aumento da confiança de um produto através da exposição de seus problemas, porém antes de sua entrega ao usuário final.” Veja mais em DevMedia.

A área de teste de software é portanto responsável por garantir a qualidade do software que está sendo entregue ao cliente, precavendo de falhas de programação e também de conceito, regras de negócio aplicadas.

O que é teste unitário?

O teste unitário tem por objetivo testar a menor parte testável do sistema (unidade), geralmente um método.
Idealmente, o teste unitário é independente de outros testes, validando assim cada parte ou funcionalidade individualmente.
Nos casos em que existe dependência de métodos ou classes que não estão sob teste, são usados mocks (objetos criados para simular o comportamento de objetos reais nos testes) para simular estes objetos ou métodos que são usados pela unidade, desacoplando a unidade sob teste dos componentes dos quais ela é dependente.” Veja mais em Mobiltec.

Quando criamos uma função ou procedimento em Excel/VBA temos diversas situações que devem ser testadas para que o código criado atenda aos requisitos da regra de negócio e que não irá apresentar erros na tela do cliente.

O teste unitário tem esta finalidade, de testar a menor unidade do programa que são as funções e procedimentos mitigando erros e aumentando a qualidade do programa.

Programa de teste unitário Excel VBA gratuito

O programa que iremos utilizar para realização dos testes unitários é um sistema de código aberto criado pela comunidade Rubberduck, que possui uma paleta com um conjunto de ferramentas que auxiliam no desenvolvimento profissional de programas em Excel VBA.

Para iniciarmos faça o download do programa seguindo o seguinte caminho:

1. Abra a página http://rubberduckvba.com/ e clique no botão Download.

Teste unitário Excel VBA

2. Clique na última versão do software e baixe clicando no link no final da página correspondente.

Teste unitário Excel VBA

3. Instale o programa seguindo os passos, e ao final o Excel já estará com o software instalado. Ao abrir o VBE você já terá ele na sua barra de ferramentas.

Teste unitário Excel VBA

Criando um programa para teste

Agora que já temos o programa de testes unitários instalados vamos criar um programa que será testado por meio deste software.

Como nosso objetivo é testar um programa e não desenvolver um, iremos utilizar o código disponibilizado pela página do Julio Battisti para a validação de números de CPF.

1. Abra uma planilha no Excel e abra o VBE Editor.

2. Crie um módulo e cole o seguinte código fonte que realiza a validação de CPF e que iremos testar. Esta função irá receber o uma string de caracteres e irá retornar True se o CPF for validado e False se o CPF estiver incorreto.

Veja também  Filtro de Dados Utilizando CheckBox e VBA
'Desenvolvido por http://juliobattisti.com.br/cursos/excelavancado/modulo6/09.asp
'Algumas alterações para retornar boolean
Public Function ValidaCPF(CPF As String) As Boolean
 
    'Função para cálculo do dígito verificador do CPF
    'Iniciamos a função com a declaração das variáveis que serão utilizadas.
    ' As variáveis d1 até d11, conterão os dígitos individuais
    ' do CPF. Por exemplo, ao digitar o CPF: 123.456.789-11, essas
    ' variáveis conterão os seguintes valores:
    ' d1=1 d2=2 d3=3 d4=4 d5=5 d6=5 d7=7 d8=8 d9=9 d10=1 d11=1
 
    Dim d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11 As Integer
 
    ' Demais variáveis que serão utilizadas para o cálculo do DV.
 
    Dim Soma1, Soma2, Resto As Integer
    Dim Resto1, Resto2 As Integer
    Dim DV1, DV2 As Integer
 
    ' Em primeiro lugar testo se a célula com o CPF contém um valor
    ' válido, isto é, um valor Não Nulo.
 
    If Not (IsNull(CPF)) Then
        '*************************************************************************
        ' Os comandos a seguir desmembram o CPF um a um , atribuindo os valores *
        ' de d1 ... d11 , usando as funções Mid$ e Val *
        ' Como o CPF está no formato de Texto, vamos extrair os dígitos do CPF *
        ' um a um, converter o respectivo valor de texto para número e atribuir *
        ' esse valor para as variáveis d1 até d11. *
        '*************************************************************************
 
        d1 = Val(Mid$(CPF, 1, 1))
        d2 = Val(Mid$(CPF, 2, 1))
        d3 = Val(Mid$(CPF, 3, 1))
        d4 = Val(Mid$(CPF, 5, 1))
        d5 = Val(Mid$(CPF, 6, 1))
        d6 = Val(Mid$(CPF, 7, 1))
        d7 = Val(Mid$(CPF, 9, 1))
        d8 = Val(Mid$(CPF, 10, 1))
        d9 = Val(Mid$(CPF, 11, 1))
        d10 = Val(Mid$(CPF, 13, 1))
        d11 = Val(Mid$(CPF, 14, 1))
 
        '*************************************************************************
        ' A partir de agora passo a utilizar os valores anteriores para cálculo *
        ' do dígito verificador do CPF *
        '*************************************************************************
 
        ' Cálculo do primeiro DV
 
        Soma1 = ((d1 * 10) + (d2 * 9) + (d3 * 8) + (d4 * 7) + (d5 * 6) + (d6 * 5) + (d7 * 4) + (d8 * 3) + (d9 * 2))
        Resto1 = (Soma1 Mod 11)
 
        If (Resto1 <= 1) Then
            DV1 = 0
        Else
            DV1 = 11 - Resto1
        End If
 
        ' Agora inicio o cálculo do segundo DV, já incorporando
        ' o segundo DV como parte do CPF, para o cálculo.
        Soma2 = (d1 * 11) + (d2 * 10) + (d3 * 9) + (d4 * 8) + (d5 * 7) + (d6 * 6) + (d7 * 5) + (d8 * 4) + (d9 * 3) + (DV1 * 2)
        Resto2 = (Soma2 Mod 11)
 
        If (Resto2 <= 1) Then
            DV2 = 0
        Else
            DV2 = 11 - Resto2
        End If
 
        ' Agora faço o teste para saber se os DVs calculados (DV1 e DV2)
        ' conferem com os DVs do CPF - d10 e d11
        If ((DV1 <> d10) Or (DV2 <> d11)) Then
            ' Atribuo a palavra "Inválido" para uma variável com o mesmo
            ' nome da função - ValidaCPF.
            ' Essa é a maneira de fazer com que a função retorne um valor,
            ' ou seja, atribuindo o valor a ser retornado, à uma variável
            ' com o mesmo nome da função.
            ValidaCPF = False
        Else
            ' Atribuo a palavra "Válido" para uma variável com o mesmo
            ' nome da função - ValidaCPF.
            ' Essa é a maneira de fazer com que a função retorne um valor,
            ' ou seja, atribuindo o valor a ser retornado, à uma variável
            ' com o mesmo nome da função.
            ValidaCPF = True
        End If
    End If
End Function
Veja também  Nacopa.Net
'Função para cálculo do dígito verificador do CPF 'Iniciamos a função com a declaração das variáveis que serão utilizadas. ' As variáveis d1 até d11, conterão os dígitos individuais ' do CPF. Por exemplo, ao digitar o CPF: 123.456.789-11, essas ' variáveis conterão os seguintes valores: ' d1=1 d2=2 d3=3 d4=4 d5=5 d6=5 d7=7 d8=8 d9=9 d10=1 d11=1 Dim d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11 As Integer ' Demais variáveis que serão utilizadas para o cálculo do DV. Dim Soma1, Soma2, Resto As Integer Dim Resto1, Resto2 As Integer Dim DV1, DV2 As Integer ' Em primeiro lugar testo se a célula com o CPF contém um valor ' válido, isto é, um valor Não Nulo. If Not (IsNull(CPF)) Then '************************************************************************* ' Os comandos a seguir desmembram o CPF um a um , atribuindo os valores * ' de d1 ... d11 , usando as funções Mid$ e Val * ' Como o CPF está no formato de Texto, vamos extrair os dígitos do CPF * ' um a um, converter o respectivo valor de texto para número e atribuir * ' esse valor para as variáveis d1 até d11. * '************************************************************************* d1 = Val(Mid$(CPF, 1, 1)) d2 = Val(Mid$(CPF, 2, 1)) d3 = Val(Mid$(CPF, 3, 1)) d4 = Val(Mid$(CPF, 5, 1)) d5 = Val(Mid$(CPF, 6, 1)) d6 = Val(Mid$(CPF, 7, 1)) d7 = Val(Mid$(CPF, 9, 1)) d8 = Val(Mid$(CPF, 10, 1)) d9 = Val(Mid$(CPF, 11, 1)) d10 = Val(Mid$(CPF, 13, 1)) d11 = Val(Mid$(CPF, 14, 1)) '************************************************************************* ' A partir de agora passo a utilizar os valores anteriores para cálculo * ' do dígito verificador do CPF * '************************************************************************* ' Cálculo do primeiro DV Soma1 = ((d1 * 10) + (d2 * 9) + (d3 * 8) + (d4 * 7) + (d5 * 6) + (d6 * 5) + (d7 * 4) + (d8 * 3) + (d9 * 2)) Resto1 = (Soma1 Mod 11) If (Resto1 <= 1) Then DV1 = 0 Else DV1 = 11 - Resto1 End If ' Agora inicio o cálculo do segundo DV, já incorporando ' o segundo DV como parte do CPF, para o cálculo. Soma2 = (d1 * 11) + (d2 * 10) + (d3 * 9) + (d4 * 8) + (d5 * 7) + (d6 * 6) + (d7 * 5) + (d8 * 4) + (d9 * 3) + (DV1 * 2) Resto2 = (Soma2 Mod 11) If (Resto2 <= 1) Then DV2 = 0 Else DV2 = 11 - Resto2 End If ' Agora faço o teste para saber se os DVs calculados (DV1 e DV2) ' conferem com os DVs do CPF - d10 e d11 If ((DV1 <> d10) Or (DV2 <> d11)) Then ' Atribuo a palavra "Inválido" para uma variável com o mesmo ' nome da função - ValidaCPF. ' Essa é a maneira de fazer com que a função retorne um valor, ' ou seja, atribuindo o valor a ser retornado, à uma variável ' com o mesmo nome da função. ValidaCPF = False Else ' Atribuo a palavra "Válido" para uma variável com o mesmo ' nome da função - ValidaCPF. ' Essa é a maneira de fazer com que a função retorne um valor, ' ou seja, atribuindo o valor a ser retornado, à uma variável ' com o mesmo nome da função. ValidaCPF = True End If End If End Function

Criada a nossa função ou procedimento o próximo passo é criar o teste unitário para verificarmos se o mesmo funciona corretamente.

Inserindo o módulo de teste unitário

Agora já estamos prontos para criar nosso primeiro teste unitário e entendermos seu funcionamento.

1. Clique em Rubberduck->Unit Tests->Text Explorer

2. Na janela que abre clique em Add->Test Module, o sistema irá criar um novo módulo no seu projeto nomeado como TestModule1

Teste unitário Excel VBA

3. Agora está criado o módulo de teste.

Veja também  Classificar tabela dinâmica Excel automaticamente

Teste unitário Excel VBA

Perceba que foram criados vários procedimentos no módulo, mas não se preocupe se não entender para que servem estes códigos neste momento, não serão necessários para o nosso teste unitário.

Criando o teste unitário

Agora iremos criar o nosso teste para a função de validação de CPF.

1. Clique em Rubberduck->Unit Tests->Text Explorer

2. Na janela que abre clique em Add->Test Method, o sistema irá criar um novo método de teste.

Teste unitário Excel VBA

Os métodos criados serão sempre encontrados pelo nome @TestMethod, você pode renomear o teste e como não vamos utilizar neste momento os blocos Arrange, Act e Assert, você pode apagar todos estes valores inclusive, o Assert.Inconclusive.

Teste unitário Excel VBA

Criando nosso próprio teste unitário

Agora iremos alterar o teste unitário padrão que foi criado pelo sistema para que ele atenda as situações que iremos criar.

O nosso CPF pode ser preenchido com valores numéricos ou não numéricos, gerando erros, então vamos criar as seguintes situações e os retornos das funções:

  • 488.162.388-52->True
  • 488.162.388-51->False
  • 023.870.776-87->True
  • 1->False

Com as situações definidas iremos implementar elas no nosso procedimento de testes TestValidarCPF.

Para inserir os testes você deve sempre iniciar eles pelo método do Rubberduck chamado Assert. Ao digitar ele irá mostrar uma gama de testes que ele pode realizar, iremos utilizar IsFalse e IsTrue para os nossos testes.

Teste unitário Excel VBA

Agora insira os seguintes códigos:

    Assert.IsTrue ValidaCPF("488.162.388-52"), "Teste 1"
    Assert.IsFalse ValidaCPF("488.162.388-51"), "Teste 2"
    Assert.IsTrue ValidaCPF("023.870.776-87"), "Teste 3"
    Assert.IsFalse ValidaCPF("1"), "Teste 4"

Note que ao inserir o intelisense demostra que também pode ser colocada uma mensagem para cada teste, ela é opcional mas pode ser interessante de se colocar em algumas situações.

Aplicando o teste unitário

Já estamos prontos para realizar o teste e verificar se o nosso procedimento de validação de CPF funciona como deveria.

1. Clique em Rubberduck->Unit Tests->Text Explorer, se não aparecer a linhar com o teste clique no primeiro ícone de Refresh em azul.

Teste unitário Excel VBA

2. Clique em Run e selecione a opção Run All Tests. O sistema irá realizar todos os testes e caso haja algum erro na validação ele irá retornar um erro.

Teste unitário Excel VBA

Teste unitário Excel VBA

Perceba que ao haver um erro o sistema apresenta a descrição do teste em que houve a falha, neste caso forçamos a validação do item 3 como IsFalse ao invés de IsTrue apenas para demonstrar o erro.

Conclusão

A realização de testes unitários é uma ferramenta sensacional para aumentar a qualidade de seus projetos em Excel VBA.

Pela minha experiência a forma mais simples de se criar os testes unitários é criá-los á medida que o sistema vai sendo criado, a cada nova função ou método, pois os requisitos estão frescos e você evitará debugar código tentando localizar erros no projeto final que poderiam ter sido evitados e principalmente que possam surgir para o cliente.

Abraço

Macos Rieper

Referências: BernardVukas.com, Rubberduckvba.com

DEIXE UMA RESPOSTA

Please enter your comment!
Please enter your name here