Serviço SFUnitTests.UnitTest

O serviço UnitTest fornece um framework para automatização de testes de unidade usando a linguagem Basic, incluindo a possibilidade de:

note

Tanto os testes unitários quanto o código a ser testado devem ser escritos em BASIC. O código que está sendo testado pode chamar funções escritas em outras linguagens.


warning

O serviço UnitTest não está disponível para scripts em Python.


Definições

Test Case

Um caso de teste é a unidade individual de teste. Ele verifica uma resposta específica para um determinado conjunto de entradas.

No serviço UnitTest, um caso de teste é representado por um único Sub do BASIC cujo nome começa com um prefixo comum (o padrão é "Test_").

O caso de teste falha se um dos métodos AssertX retornar False.

Suíte de teste

Uma suite de teste é uma coleção de casos de teste que devem ser executados juntos.

Todos os casos de teste de uma suíte são armazenados num único módulo do BASIC.

Uma suíte de testes pode implementar os métodos SetUp e TearDown para preparar os casos de teste em seu módulo.

Unidade de teste

Uma unidade de teste completa consiste de um conjunto de suítes de teste na mesma biblioteca BASIC.

Invocação do serviço

Antes de usar o serviço UnitTest a biblioteca ScriptForge precisa ser carregada ou importada:

note

• Macros BASIC precisam carregar a biblioteca ScriptForge usando a seguinte instrução:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")

• Scripts Python exigem uma importação do módulo scriptforge:
from scriptforge import CreateScriptService


Modo simples

Chame o serviço no modo simples para chamar as funções AssertX sem ter que construir a hierarquia completa de suítes de testes e casos de teste.

No modo simples, o serviço é invocado dentro do caso de teste, conforme mostrado no exemplo abaixo:


    Sub SimpleTest
        On Local Error GoTo CatchError
        Dim myTest As Variant
        myTest = CreateScriptService("UnitTest")
        ' Alguns testes fictícios
        myTest.AssertEqual(1 + 1, 2)
        myTest.AssertEqual(1 - 1, 0)
        MsgBox("Passou todos os testes")
        Exit Sub
    CatchError:
        myTest.ReportError("Um teste falhou")
    End Sub
  

Neste exemplo, se qualquer uma das chamadas AssertEqual falhar, o interpretador irá para o rótulo CatchError e reportará o erro chamando o método ReportError .

Modo completo

Quando invocado no modo completo, a criação do serviço é externa ao código de teste e todos os testes são organizados em casos de teste e suítes de teste dentro de uma única biblioteca.

O exemplo a seguir cria uma instância UnitTest cujos testes estão localizados dentro do documento atual (ThisComponent) na biblioteca "Tests".


    GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
    Dim myUnitTest As Variant
    myUnitTest = CreateScriptService("UnitTest", ThisComponent, "Tests")
  

Um exemplo minimalista em modo completo

Considere que um arquivo ODS possui um módulo chamado "MathUtils" em sua biblioteca "Standard" com o seguinte código:


    ' Código no módulo Standard.MathUtils
    Function Sum(a, b) As Double
        Sum = a + b
    End Function
    
    Function Multiply(a, b) As Double
        Multiply = a * b
    End Function
  

Para criar uma suíte de testes completa, considere que uma nova biblioteca chamada "Tests" é criada no arquivo com um único módulo "AllTests" contendo o código abaixo:


    ' Código no módulo Tests.AllTests
    Sub Main()
        GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
        Dim test As Variant
        test = CreateScriptService("UnitTest", ThisComponent, "Tests")
        test.RunTest("AllTests")
        test.Dispose()
    End Sub
    
    Sub Setup(test)
        ' O código de preparação foi executado antes do primeiro caso de teste
        Dim exc As Variant
        exc = CreateScriptService("Exception")
        exc.Console(Modal := False)
    End Sub
    
    Sub TearDown(test)
        ' Código de limpeza opcional chamado após o último caso de teste
    End Sub
    
    Sub Test_Sum(test)
        On Local Error GoTo CatchError
        test.AssertEqual(Sum(1, 1), 2, "Soma dois inteiros positivos")
        test.AssertEqual(Sum(-10, 20), 10, "Soma de inteiros negativos e positivos")
        test.AssertEqual(Sum(1.5, 1), 2.5, "Soma de valores inteiros e ponto flutuante")
        Exit Sub
    CatchError:
        test.ReportError("O método Soma não funciona")
    End Sub
    
    Sub Test_Multiply(test)
        On Local Error GoTo CatchError
        test.AssertEqual(Multiply(2, 2), 4, "Multiplica dois inteiros positivos")
        test.AssertEqual(Multiply(-4, 2), -8, "Multiplica inteiros negativos e positivos")
        test.AssertEqual(Multiply(1.5, 3), 4.5, "Multiplica valores inteiro e de ponto flutuante")
        Exit Sub
    CatchError:
        test.ReportError("O método Multiplicar não funciona")
    End Sub
  

O suíte de testes acima consiste em dois casos de teste Test_Sum e Test_Multiply. Para executar todos os testes, basta executar o método Main do módulo "AllTests".

O Console do serviço Exception é usado como saída padrão para imprimir os resultados do teste. Após executar o exemplo acima, a seguinte saída será exibida no console:


    ' RUNTEST ENTER testsuite='Tests.AllTests', pattern='Test_*'
    '   SETUP Tests.AllTests.Setup() ENTER
    '   SETUP Tests.AllTests.Setup() EXIT
    '   TESTCASE Tests.AllTests.Test_Multiply() ENTER
    '   TESTCASE Tests.AllTests.Test_Multiply() EXIT (0,017 sec)
    '   TESTCASE Tests.AllTests.Test_Sum() ENTER
    '   TESTCASE Tests.AllTests.Test_Sum() EXIT (0,016 sec)
    '   TEARDOWN Tests.AllTests.TearDown() ENTER
    '   TEARDOWN Tests.AllTests.TearDown() EXIT
    ' RUNTEST EXIT testsuite='Tests.AllTests' (0,223 sec)
  

Se algum dos métodos AssertEqual falhar durante esses testes, uma mensagem de erro será adicionada ao console.

Propriedades

Nome

Só leitura

Tipo

Descrição

LongMessage

Não

Boolean

Quando definido como True (padrão), o console mostra a mensagem padrão anexada à mensagem fornecida pelo testador. Quando False, apenas a mensagem definida pelo testador é usada.

ReturnCode

Sim

Integer

Valor retornado por RunTest após a conclusão do teste de unidade. A seguir, uma lista de valores possíveis:

0 - Teste finalizado sem erros ou teste não iniciado
1 - Uma asserção dentro de um caso de teste retornou False
2 - Um SkipTest foi emitido pelo Método Setup ou por um dos casos de teste.
3 - Final de teste anormal

Verbose

Não

Boolean

Quando definido como True, todas as asserções são relatadas no console (com falha ou não). Quando False (padrão), apenas as asserções com falha são relatadas.

WhenAssertionFails

Não

Integer

Define o que é feito quando uma asserção falha. A seguir, uma lista de valores possíveis:

0 - Ignora a falha e continua executando o teste
1 - Executa na suíte de teste o método TearDown no módulo e a próxima suíte de testes é iniciada (padrão em modo completo).
2 - Para imediatamente (padrão no modo simples)


Lista de métodos no serviço UnitTest

AssertAlmostEqual
AssertEqual
AssertFalse
AssertGreater
AssertGreaterEqual
AssertIn
AssertIsInstance
AssertIsNothing
AssertLike

AssertNotRegex
AssertIsNull
AssertLess
AssertLessEqual
AssertNotAlmostEqual
AssertNotEqual
AssertNotIn
AssertNotInstance
AssertNotLike

AssertNotNothing
AssertNotNull
AssertRegex
AssertTrue
Fail
Log
ReportError
RunTest
SkipTest


Argumentos dos métodos AssertX

Todas as asserções testam uma ou duas expressões, referidas no restante desta página de ajuda como A e B. Eles são sempre os primeiros ou segundos argumentos no método AssertX.

Todos os métodos AssertX aceitam um argumento message especificando uma mensagem personalizada a ser relatada no console referente à asserção. Por padrão, utiliza uma string vazia. Este argumento está sempre na última posição da asserção.

Alguns métodos AssertX também aceitam argumentos adicionais, conforme descrito por suas sintaxes abaixo.

AssertAlmostEqual

Retorna True quando A e B são valores numéricos e são considerados próximos um do outro, dada uma tolerância relativa.

Sintaxe:

svc.AssertAlmostEqual(a: any, b: any, tolerance: double = 1E-09, message: str = ""): bool

Esta declaração retorna True se as duas condições abaixo forem atendidas:

AssertEqual

Retorna True quando A e B são considerados iguais.

Sintaxe:

svc.AssertEqual(a: any, b: any, message: str = ""): bool

Quando A e B são escalares, retorna True se:

Quando A e B são matrizes, retorna True se:

AssertFalse

Retorna True quando o tipo de A é Boolean e seu valor é False.

Sintaxe:

svc.AssertFalse(a: any, message: str = ""): bool

AssertGreater

Retorna True quando A é maior que B.

Sintaxe:

svc.AssertGreater(a: any, b: any, message: str = ""): bool

A comparação entre A e B assume o seguinte:

AssertGreaterEqual

Retorna True quando A é maior ou igual a B.

Sintaxe:

svc.AssertGreaterEqual(a: any, b: any, message: str = ""): bool

A comparação entre A e B assume o seguinte:

AssertIn

Retorna True quando A está dentro de B.

Sintaxe:

svc.AssertIn(a: any, b: any, message: str = ""): bool

Esta asserção pressupõe o seguinte:

AssertIsInstance

Retorna True quando A é uma instância de um tipo de objeto especificado, indicado como uma string contendo o nome do tipo.

Sintaxe:

svc.AssertIsInstance(a: any, objecttype: str, message: str = ""): bool

A expressão A pode ser uma das seguintes:

AssertIsNothing

Retorna True quando A é um objeto que tem o valor Nothing.

Sintaxe:

svc.AssertIsNothing(a: any, message: str = ""): bool

AssertIsNull

Retorna True quando A tem o valor Null.

Sintaxe:

svc.AssertIsNull(a: any, message: str = ""): bool

AssertLess

Retorna True quando A é menor que B.

Sintaxe:

svc.AssertLess(a: any, b: any, message: str = ""): bool

A comparação entre A e B assume o seguinte:

AssertLessEqual

Retorna True quando A é menor ou igual a B.

Sintaxe:

svc.AssertLessEqual(a: any, b: any, message: str = ""): bool

A comparação entre A e B assume o seguinte:

AssertLike

Retorna True se a String A corresponde a um dado padrão contendo caracteres curinga.

Sintaxe:

svc.AssertLike(a: any, pattern: str = "", message: str = ""): bool

Os seguintes caracteres curinga são aceitos:

AssertNotAlmostEqual

Retorna True quando A e B são valores numéricos e não são considerados próximos um do outro, dada uma tolerância relativa.

Sintaxe:

svc.AssertNotAlmostEqual(a: any, b: any, tolerance: double = 1E-09, message: str = ""): bool

Esta declaração retorna True se as duas condições abaixo forem atendidas:

AssertNotEqual

Retorna True quando A e B não são considerados iguais.

Sintaxe:

svc.AssertNotEqual(a: any, b: any, message: str = ""): bool

Este método funciona tanto para escalares quanto para matrizes. Leia as instruções em AssertEqual para obter mais informações sobre o que significa igualdade nesta asserção.

AssertNotIn

Retorna True quando A (uma string) não é encontrada em B.

Sintaxe:

svc.AssertNotIn(a: any, b: any, message: str = ""): bool

Leia as instruções em AssertIn para obter mais informações sobre as premissas deste método .

AssertNotInstance

Retorna True quando A não é uma instância de um tipo de objeto especificado.

Sintaxe:

svc.AssertNotInstance(a: any, objecttype: str, message: str = ""): bool

Consulte AssertIsInstance para obter mais informações sobre as premissas desse método .

AssertNotLike

Retorna True se a String A não corresponde a um dado padrão contendo caracteres curinga.

Sintaxe:

svc.AssertNotLike(a: any, pattern: str = "", message: str = ""): bool

Consulte AssertLike para obter mais informações sobre as premissas deste método .

AssertNotNothing

Retorna True exceto quando A é um objeto que tem o valor Nothing.

Sintaxe:

svc.AssertNotNothing(a: any, message: str = ""): bool

AssertNotNull

Retorna True exceto quando A tem o valor Null.

Sintaxe:

svc.AssertNotNull(a: any, message: str = ""): bool

AssertNotRegex

Retorna True quando A não é uma string ou não corresponde à expressão regular fornecida.

Sintaxe:

svc.AssertNotRegex(a: any, regex: str = "", message: str = ""): bool

A comparação diferencia maiúsculas de minúsculas.

AssertRegex

Retorna True se a String A corresponde a uma dada expressão regular.

Sintaxe:

svc.AssertRegex(a: any, regex: str = "", message: str = ""): bool

A comparação diferencia maiúsculas de minúsculas.

AssertTrue

Retorna True quando a expressão A é Boolean e seu valor é True.

Sintaxe:

svc.AssertTrue(a: any, message: str = ""): bool

Fail

Força um teste a falhar.

Sintaxe:

svc.Fail(message: str = "")

Uma mensagem pode ser fornecida para ser relatada no console.

Log

Grava a mensagem especificada no console.

Sintaxe:

svc.Log(message: str = "")

Uma mensagem pode ser fornecida para ser relatada no console.

ReportError

Exibe uma caixa de diálogo com uma mensagem e os valores de propriedade atuais do serviço Exception.

Este método é comumente usado na seção de tratamento de exceções de uma Sub que contém o caso de teste, que é alcançado quando uma asserção falha ou quando chamar o método Fail.

Sintaxe:

svc.ReportError(message: str = "")

Dependendo do valor da propriedade WhenAssertionFails, a execução do teste pode continuar ou ser interrompida.

Ao escrever casos de teste é recomendado incluir uma chamada para o método ReportError na seção de tratamento de exceções da Sub.

Se a propriedade LongMessage for True, a mensagem especificada será seguida pela descrição da mensagem de erro padrão. Caso contrário, apenas a mensagem será exibida.

RunTest

Executa o conjunto de testes completo implementado no módulo especificado. Cada caso de teste é executado independentemente um do outro.

A execução de um suíte de testes consiste de:

  1. Executar o método opcional Setup presente no módulo.

  2. Executar uma vez a cada caso de teste, sem ordem específica.

  3. Executar o método opcional TearDown presente no módulo.

Sintaxe:

svc.RunTest(testsuite: str, testcasepattern: str = "", message: str = ""): int

O argumento testcasepattern especifica um padrão composto por "?" e curingas "*" para selecionar quais casos de teste serão executados. A comparação não diferencia maiúsculas de minúsculas.

Se fornecer uma mensagem, ela será gravada no console quando o teste for iniciado.

SkipTest

Interrompe a suíte de testes em execução sem chamar o método TearDown.

Ignorar um teste geralmente faz sentido no método Setup quando nem todas as condições para executar o teste são atendidas.

Cabe ao método Setup sair do Sub logo após a chamada SkipTest.

Se SkipTest for chamado de dentro de um caso de teste, a execução do conjunto de testes será interrompida e os casos de teste restantes não serão executados. Lembre-se de que a ordem na qual os casos de teste são executados é arbitrária em um conjunto de testes.

Sintaxe:

svc.SkipTest(message: str = "")

Se fornecer uma mensagem, ela será gravada no console.

♥ Doe para nosso projeto! ♥