Redes sociais

Usando Assertions

25 maio 2023 -

Olá Pessoal, tudo bem com vocês?

Hoje vim falar um pouquinho sobre o Assert, uma função muito usada em testes unitários mas pouco difundida durante o desenvolvimento do código de produção.


Mas, afinal, o que faz o Assert e como ele pode nos ajudar?


O Assert é um dos métodos intrínsecos do Delphi que pode ser usado como uma ferramenta de debug para testarmos condições que não deveriam ser violadas. Ele nos ajuda a interceptar uma situação inesperada interrompendo, então, a execução do programa.

Esse método recebe por parâmetro uma expressão booleana e, opcionalmente, uma mensagem em formato string. Se o teste da expressão falhar, o Assert lançará uma exceção do tipo EAssertionFailed:
procedure Assert(Condition: Boolean; [ Message: string ]); overload;
Assim, um exemplo de uso do Assert seria:
procedure TfrmTesteAssert.btnTestarAssert1Click(Sender: TObject);
var
  l: Integer;
begin
  l := 10;
  Assert(l = 0);
  Inc(l);
end;
No exemplo acima, como o valor da variável l não é igual a zero, então, o Assert lançará a seguinte exceção e nem mesmo executará o código após a validação.


Veja que, além da mensagem “Assertion failure”, ele também nos retornou o nome da unit e a linha onde o erro aconteceu.

Personalizando a mensagem de erro


Caso seja passado uma mensagem no segundo parâmetro da chamada do Assert, o retorno “Assertion failure” será substituído pela mensagem informada, por exemplo:
procedure TfrmTesteAssert.btnTestarAssert2Click(Sender: TObject);
var
  l: Integer;
begin
  l := 10;
  Assert(l = 0, 'Número precisa ser igual a 0 (zero), mas foi informado: ' + l.ToString);
  Inc(l);
end;
Neste caso a exceção apresentada será:


Mas, quando utilizar o Assert?


O Assert, é um procedimento de prática defensiva, ou seja, ele deve ser utilizado para garantir o estado do seu programa, pegando o erro antes mesmo que ele aconteça em ambiente de produção, e nunca deve ser utilizado para validação de entrada de dados.

Veja que, além de interromper a execução do programa, o Assert também exibe informações técnicas, como o nome da unit e linha onde a validação falhou, por isso, é importante sempre desativar os asserts ao buildarmos a aplicação em release para distribuição ao usuário final. E para isso, o Delphi nos disponibiliza algumas formas.

A primeira, é pelas opções do projeto, na qual é possível ajustar a opção Assertions, localizada dentro da aba Compiling, conforme pode-se ver na imagem abaixo:


Dica: para acessar as opções do projeto, basta ir no menu Project e lá no final você vai encontrar a opção Options.

A segunda forma é através de diretivas de compilação, que podem ser colocadas em blocos de códigos, ou definida para toda uma unit. São elas:
$ASSERTIONS ON/OFF  // long form
$C +/-  // short form
Para desativar em um bloco de código, você pode usar da seguinte forma:
procedure TfrmTesteAssert.btnTestarAssert3Click(Sender: TObject);
var
  l: Integer;
begin
  l := 10;
  {$ASSERTIONS OFF}
  Assert(l = 0, 'Número precisa ser igual a 0 (zero), mas foi informado: ' + l.ToString);
  {$ASSERTIONS ON}
  l := 0;
  Assert(l = 10, 'Número precisa ser igual a 10 (zero), mas foi informado: ' + l.ToString);
end;
Já para desativar a diretiva em um arquivo inteiro, você precisa colocar a diretiva bem no início do arquivo. Por exemplo:
unit OutroTeste;

interface

{$ASSERTIONS OFF}

uses
  Dialogs;

Importante dizer, que essa diretiva vale por arquivo, ou seja, para cada arquivo que desejarmos desativar o Assert será necessário colocar a diretiva. Caso a intenção seja desativar do projeto inteiro, basta utilizar a primeira opção, ou seja, desativar nas configurações do projeto.

Por fim, podemos concluir que:
  • O uso do Assert pode ser bem útil na busca de bugs ainda na fase de desenvolvimento;
  • O seu uso não substitui os Testes Unitários ou os Testes de Integração, que são extremamente importantes para garantir o correto funcionamento do sistema.

A documentação oficial do Assert você pode conferir no site da Embarcadero que explica sobre esta função.

Forte abraço e nos vemos no próximo post! ;)

Autor: Flávia Melo


Esse exemplo e tantos outros disponíveis aqui no blog, você pode conferir acessando meu repositório no github.

Postar um comentário