Pular para o conteúdo principal

Testes em função e em classe

O PROBAT aceita testes escritos de duas formas: função (mais direto) ou classe (habilita @Test por método, setups e teardowns). Regras que valem para as duas formas:

  • Importar a include tlpp-probat.th
  • Marcar com @TestFixture
  • Executar ao menos uma função de assert — sem assert, não há resultado registrado
  • Sempre retornar .T. — a menos que você estruture o teste para retornar .F. em alguns casos, gerando erro automático ao final da execução
  • Compilar o fonte no mesmo ambiente onde os testes serão executados

Teste em função

A forma mais enxuta e menos verbosa — indicada para validações simples e para quem tem menos familiaridade com orientação a objetos:

#include "tlpp-probat.th"

namespace test.tlpp

@TestFixture(owner='sample',target="sample_ok.tlpp")
function U_test_sample_function()

local cTest := 'test_1'
local xValue := tlpp.U_sampleOK( cTest )
local xExpected := cTest

tlpp.probat.assertEquals( xValue, xExpected , 'tlpp.U_sampleOK( cTest )' )

return .T.

A facilidade tem um custo: a função não dispõe dos recursos avançados de estruturação (ciclo de vida, vários testes por alvo com estado compartilhado).

Documentação oficial: Teste simples com função.

Teste em classe

Com classe entra a include tlpp-core.th e cada método de teste é anotado com @Test('descrição'). Com using namespace tlpp.probat, os asserts são chamados sem prefixo:

#include "tlpp-core.th"
#include "tlpp-probat.th"

namespace test.tlpp

using namespace tlpp.probat

#define _str_ "teste_class"

@TestFixture(owner='sample',target="sample_ok.tlpp")
class test_sample_class

private data cTeste as character

public method new() constructor

@Test('aqui deve-se colocar o descritivo sobre o teste')
public method test_sampleOK()

endclass

method new() class test_sample_class
::cTeste := _str_
return self

method test_sampleOK() class test_sample_class

local cValue := tlpp.U_sampleOK( _str_ )

// Result, Expected
assertEquals( cValue , ::cTeste )

return .T.

Além do @Test por método, a classe habilita o ciclo de vida completo (@OneTimeSetUp, @Setup, @TearDown, @OneTimeTearDown) — ver Annotations.

Documentação oficial: b - Teste simples com classe.

Quando usar cada forma

CenárioForma indicada
Validação pontual de uma funçãoFunção
Vários testes sobre o mesmo alvo, com estado compartilhadoClasse
Precisa de @Setup / @TearDown (BD, massa de dados)Classe
Time com pouca familiaridade com orientação a objetosFunção

Testando fontes AdvPL

Testes são sempre escritos em TLPP, mas o código testado pode ser AdvPL (.prw). O exemplo test/unit/prw/test_sample_prw.tlpp cobre a função de src/prw/sample_sum_parameters.prw.

Exemplos no repositório

ArquivoO que demonstra
test/probat_resources/test_sample_function.tlppTeste mínimo em função
test/probat_resources/test_sample_class.tlppTeste mínimo em classe
test/probat_resources/test_sample_class_full.tlppClasse completa com vários métodos e ciclo de vida
test/unit/utils/test_echo_with_function.tlppTeste unitário em função
test/unit/utils/test_echo_with_class.tlppTeste unitário em classe
test/unit/prw/test_sample_prw.tlppTeste TLPP cobrindo fonte .prw (AdvPL)

Exemplos no GitHub

Fontes .tlpp no repositório: Recursos básicos.