Fala ai Radizeiros e Radizeiras, tudo bem com vocês?

Você está preparado para entregar uma solução robusta e eficaz.

Implementar testes unitários em suas aplicações e utilizar todos os seus benefícios irá facilitar muito a sua vida, quando seu cliente disser “toda atualização é uma surpresa diferente, algo novo não funciona e o que funcionava para de funcionar, não aguento mais isso”

Aqui no blog falei um pouco de como usarmos o DUnitx, agora irei falar de mais algumas implementações que irá lhe ajudar muito em seus testes.

Então vamos lá?

Nós temos uma classe Pessoa que tem apenas o método de tratar CPFCNPJ  onde ele está limpando a mascara.


type
    TPessoa = class
        function TratarCPFCNPJ(aValue : String) : String;
    end;

implementation

{ TPessoa }

function TPessoa.TratarCPFCNPJ(aValue: String): String;
var
    I: Integer;
begin
    for I := 1 to Length(aValue) do
    begin
        if aValue[I] in ['0','1','2','3','4','5','6','7','8','9'] then
        Result := Result + aValue[I];
    end;
end;

No código de testes abaixo ele está muito engessado.


type
    [TestFixture]
    TMyTestObject = class(TObject)
    private
        FPessoa : TPessoa;
    public
        [Setup]
        procedure Setup;
        [TearDown]
        procedure TearDown;
        [Test]
        procedure TesteTratarCPFCNPJ;
     end;

implementation

procedure TMyTestObject.Setup;
begin
    FPessoa := TPessoa.Create;
end;

procedure TMyTestObject.TearDown;
begin
   FPessoa.Free;
end;

procedure TMyTestObject.TesteTratarCPFCNPJ;
var
    Resultado : String;
begin
    Resultado := FPessoa.TratarCPFCNPJ('123.123.123-12');
    Assert.IsTrue(Resultado = '12312312312', 'TPessoa.TratarCPFCNPJ retornou um erro');
end;

initialization
    TDUnitX.RegisterTestFixture(TMyTestObject);
end.

Digamos que a função de teste seja usada em diversos outros métodos, não só CPFCNPJ.

Creio que você possa ter em seu projeto uma função que é usada em qualquer lugar, em varias telas diferentes, em cada tela ela recebe parâmetro diferente, ela tema um comportamento diferente, referente aos parâmetros de entrada.

Existe uma forma dentro do nosso DUnitX para que nós possamos testar isso ai também.

Então como posso fazer?

Primeiro vamos incluir um método em  nossa classe de testes, neste método iremos ter dois valores, o primeiro valor é de entrada, chamado aValue, e o segundo é o aResultado, que é o resultado que eu espero a partir desse valor de entrada, chamado aResult, nosso método terá um parâmetro de entrada e terá um resultado, e irei dizer o resultado através de diretivas nesse método.


...
    [Test]
    [TestCase('CaseCPF','123.123.123-12,12312312312')]
    [TestCase('CaseCNPJ','12.123.123/0001-12,12123123000112')]
    procedure TratarCPFCNPJ(aValue : String; aResult : String);
...

Podemos observar em nosso código acima as diretivas, onde  [Test] que representa o teste que o DUnitX terá que executar, em seguida usamos a [TestCase] esta diretiva como você pode observar usamos tanto para o CPF e CNPJ, neste ponto nosso método irá realizar os testes com base nestas diretivas, e digamos que amanhã que iremos utilizar esse método para validar outra coisa, basta ir e incluir mais uma diretiva de [TestCase].


...

procedure TMyTestObject.TratarCPFCNPJ(aValue, aResult: String);
var
    Resultado : String;
begin
    Resultado := FPessoa.TratarCPFCNPJ(aValue);
    Assert.IsTrue(Resultado = aResult, 'TPessoa.TratarCPFCNPJ');
end;

...

Observe como é simples a implementação do teste unitário usando TestCase?

Criamos uma variável do tipo String, recebemos o retorno do método e verificamos  se a variável Resultado é igual ao valor passado pro aResult, caso não seja retornamos uma mensagem informando que o erro foi no método TratarCPFCNPJ.

Vamos executar e verificar o resultado do teste?

Podemos observar que foram realizados 3 testes e 3 testes passaram.

Vamos simular um erro para que possamos verificar o retorno do teste.


...

function TPessoa.TratarCPFCNPJ(aValue: String): String;
var
    I: Integer;
begin
    for I := 1 to Length(aValue) do
    begin
        if aValue[I] in ['0','1','2','3','4','5','6','7','8','9'] then
        Result := Result + aValue[I]+'x';
    end;
end;

...

Em nossa classe TPessoa incluímos apenas um “x” no final do result do método TratarCPFCNPJ para que possa resultar no erro.

Vamos ver como irá nos retornar o teste unitário?

Todos os 3 testes foram executados e todos os 3 falharam.

Viu como nosso teste nos retorna?

Ele passa exatamente aquilo que informamos que deveria retornar em caso de erro, veja em qual método ele deu o erro, é nesse ponto que vamos e ajustamos o que for preciso para que nossa aplicação não venha mas resultar em erros e passar com sucesso nos testes.

Trabalhar com testes unitário nos ajuda e reduzir muito os erros ocasionados internamente em nosso sistema, e claro, automatizando esses testes, para que não venhamos ter que a cada implementação ter que realizar testes dentro do código e as vezes esquecendo do famigerado showmessage na aplicação.

Este post é mais um que faz parte de um dos meus treinamentos o treinamento de Testes unitários em Delphi.

O QUE VOCÊ IRÁ APRENDER?

O treinamento de Teste de Software dará a você a oportunidade de melhorar seu desenvolvimento, otimizar o seu tempo e te dar a possibilidade de atender melhor os seus clientes.
Implementar testes unitários em suas aplicações e utilizar todos os seus benefícios irá facilitar muito a sua vida, quando seu cliente disser :

“toda atualização é uma surpresa diferente, algo novo não funciona e o que funcionava para de funcionar, não aguento mais isso”

Você estará preparado para entregar uma solução robusta e eficaz.

Nesse treinamento você irá aprender de forma prática a desenvolver rotinas de testes para evitar erros e aumentar a segurança das suas aplicações.

CLIQUE AQUI E SAIBA MAIS SOBRE O TREINAMENTO TESTES UNITÁRIO EM DELPHI