Article image
Fernando Araujo
Fernando Araujo08/03/2023 15:48
Compartilhe

Como fazer o Teste de Mesa manual

    Olá, dev!

               

    Como muitos de vocês já sabem, eu sou um dinossauro da programação, pois aprendi a programar em 1980, com a linguagem FORTRAN e perfurando cartões! A maneira “jurássica” que a gente tinha para acompanhar a execução de um programa era com o teste de mesa.

               

    Atualmente, em algumas situações, ele ainda é usado e, na falta de ferramentas modernas disponíveis, ajuda no entendimento do objetivo de um programa, facilita a depuração e, principalmente, é uma ferramenta didática para o programador iniciante começar a entender o funcionamento de um programa, da dinâmica das variáveis e do fluxo de execução.


               Neste artigo, eu vou mostrar o que é e como fazer o teste de mesa. Além disso, vou tratar de como usar outras técnicas básicas para melhorar o entendimento de problemas e como implementar suas soluções, usando o computador.

     

    O que você vai ler aqui:

    1. Introdução
    2. O entendimento do problema e do resultado pedido
    3. A ajuda dos desenhos e rascunhos na solução de problemas
    4. As ferramentas digitais para acompanhamento de algoritmos
    5. Desenhos usados para ajudar na solução dos problemas
    6. Acompanhamento da execução de um programa
    7. Conclusão

     

    1 – Introdução


    Eu tenho 61 anos, aprendi a programar em 1980, com a linguagem FORTRAN e perfurando cartões! A gente acompanhava a execução de um programa de forma “jurássica”, usando uma ferramenta chamada Teste de Mesa.


    Naquele tempo, não havia computadores pessoais, nem interfaces gráficas, nem compiladores, nem IDEs, nem Windows, nem Linux, nem Android. Eu já escrevi dois artigos na DIO descrevendo a nossa saga para programar naquela época:


    Dinossauros 1 - Como virei um programador (com FORTRAN!!!) em 1980?

     

    Dinossauros 2 - E como era essa tal de linguagem FORTRAN?


    É possível que os devs mais novos (ou aqueles que estão em transição de carreira) já tenham ouvido falar do teste de mesa. A verdade é que atualmente existem tantas ferramentas digitais de acompanhamento automático de programas, oferecidas nos diversos compiladores e IDEs disponíveis para se programar, que o teste de mesa ficou obsoleto e até é motivo de piada quando alguém fala que ainda usa.


    Sem medo de virar meme, por ainda usar essa técnica, eu vou me atrever a falar do teste aqui. Atualmente, em algumas situações, ele ainda é usado e, na falta de ferramentas modernas disponíveis, ajuda no entendimento do objetivo de um programa, facilita a depuração e, principalmente, é uma ferramenta didática para o programador iniciante começar a entender o funcionamento de um programa, da dinâmica das variáveis e do fluxo de execução.


    Neste artigo, eu vou mostrar o que é o teste de mesa e como fazê-lo. Além disso, vou tratar sobre o uso de outras técnicas básicas para melhorar o entendimento de problemas e a implementação de soluções usando o computador.


    O teste de mesa tem como base a Lógica de Programação, pois ele permite acompanhar a execução de um programa, que pode ser associado a um algoritmo para a resolução de problemas por meio de programas de computador.


    Essa lógica é o terror dos iniciantes, a etapa importante negligenciada por grande parte dos programadores mais experientes e um dos fundamentos mais importantes para quem quer codificar a solução de qualquer problema.


               Eu tratarei o assunto de forma bem direta, objetiva e prática, deixando de lado toda a conceituação teórica por trás do tema, os conhecimentos acadêmicos e as opiniões polêmicas contrárias, que buscam uma verdade absoluta para o conceito e as técnicas associadas.


    Todo mundo aqui na DIO já sabe (ou já ouviu) que a base da programação é a Lógica de Programação e que aprender a programar sem saber dela é difícil.


    Em parte, isso é verdadeiro, pois a codificação nada mais é do que a conversão dos passos necessários para se resolver um determinado problema em código de alguma linguagem de programação. Realmente, fica difícil definir os passos para codificar um programa equivalente sem a tal lógica de programação. Mas ninguém nasce com esse conhecimento, ele pode ser aprendido por qualquer pessoa.


    O conceito de lógica não nasceu com a programação, mas se aplica a qualquer problema que precisa ser resolvido. Eu gosto de dizer que a Lógica de Programação acaba se resumindo aos algoritmos, que são os passos que devem ser aplicados em sequência para se resolver um problema. Qualquer problema! De qualquer área!


    Com o algoritmo escrito, para codificar um programa de computador basta traduzir cada ação descrita pelos seus passos em código de alguma linguagem, de programação. O teste de mesa é o acompanhamento da execução de um programa, em geral, manual, dos valores atribuídos às diversas variáveis que aparecem no programa escrito. 


    Os algoritmos usam o conceito de redução de escopo - ou divisão e conquista (“divide and conquer”), que quebra um problema grande em pedaços menores, mais facilmente gerenciáveis e resolvidos de forma mais simples e direta. Essa redução de escopo também pode ser chamada de refinamento sucessivo.


    Além disso, outra técnica que ajuda MUITO na resolução de problemas é o uso de desenhos e diagramas que representam o problema a ser resolvido.


    E, como última ferramenta tratada, mas primordial desde o início, a interpretação de textos. Ou seja, a leitura atenta do enunciado do problema e seus requisitos para permitir a extração dos dados que serão usados na solução.

     

    2 – O entendimento do problema e do resultado pedido


    image


    O entendimento de um problema parte do seu enunciado, e é o entendimento do problema apresentado, dos seus requisitos, os dados oferecidos e as respostas pedidas. A leitura atenta do enunciado do problema permite identificar cada parte dessa. Até aí, o conhecimento de português e interpretação de textos é a ferramenta principal.


    Só que o entendimento pode ser facilitado com o uso de outras ferramentas como anotações e desenhos. Isso pode ser feito de forma manual ou usando algum programa/aplicativo. 


    Agora uma pausa para uma historinha pessoal.


    Nos anos de 1983 e 1984, eu fui professor de Física do 2º Grau (hoje, é o Ensino Médio), tanto pela oportunidade que surgiu no Colégio em que eu havia estudado como pelo meu gosto e facilidade com disciplinas de cálculo. Eu ainda estava cursando graduação em Engenharia Elétrica, mas decidi experimentar aquela atividade de que eu tanto admirava nos meus professores, a de ensinar!


    Eu fui o sétimo professor de Física naquele ano, 2º Ano do 2º Grau. Desde o início, eu verifiquei que os alunos cometiam erros grosseiros nos exercícios da matéria. Ali eu notei como era difícil para os meus alunos resolverem questões de Física!


    A princípio, eu achei que era falta de base da Física mesmo, depois vi que era também dificuldade em Matemática. Ao longo do tempo, eu comprovei que a dificuldade já começava na língua portuguesa, na interpretação de textos!


    Eles tinham dificuldade de entender o enunciado, o que era pedido, de lembrar das equações que regiam os problemas, e erravam os cálculos, dando respostas erradas.


    Dessa forma, eu precisei re-ensinar desde o zero como resolver um problema. Eu dei aulas nível Massinha 1 sobre resolução de problemas e fiz um checklist parecido com esse:

    1. Ler o enunciado até o entendimento claro do problema e do resultado pedido;
    2. Fazer um diagrama do problema, com um desenho à mão livre;
    3. Extrair os dados informados no enunciado e indicar o dado pedido;
    4. Listar as possíveis fórmulas usadas para a resolução do problema;
    5. Escolher as fórmulas e a sequência de aplicação delas para fazer os cálculos;
    6. Substituir os valores dos dados para chegar a resultados intermediários e o resultado final;
    7. Em uma linha final, responder ao questionamento pedido para o problema;
    8. Grifar essa última linha (circundar, sublinhar, desenhar uma seta, etc.)


    Os passos de 1 a 3 representam o entendimento do problema. Os passos 4 e 5 dizem respeito aos conhecimentos da Física. Só o passo 6 tem a ver com a Matemática. O passo 7 também tem a ver com o entendimento do que é o problema e o passo 8 é a clareza de onde está a sua resposta. Então, para a resolução de um problema de Física, nem tudo é relacionado à Física propriamente dita, mas ao entendimento do que se pede e aos cálculos que serão realizados.


    A quebra do problema inicial em passos menores é o que chamamos de divisão e conquista, pois a solução dos problemas menores sempre é mais fácil do que tentar resolver tudo de uma vez só.


    O entendimento do problema visa descobrir quais informações são dadas e quais são pedidas, quantidades que deverão virar variáveis das fórmulas matemáticas que serão usadas para os cálculos, bem como alguns detalhes implícitos no texto do enunciado, palavras modificadoras importantes (sempre, algum, nenhum, nunca, o maior, o menor, o dobro, o triplo, etc.).

    O desenho ou diagrama ajuda a ter uma visão geral do problema, sua execução e da interação entre os elementos.

    As equações possíveis facilitam a escolha de quais usar para cada tipo de problema.

    Os cálculos darão o resultado pedido.

    E a resposta final indicará o dado pedido em um espaço único.


    O principal objetivo dessa lista de ações é torná-las um hábito na resolução de problemas, de modo que o aluno não precise recorrer a ela no futuro, após algumas aplicações. Aliás, o uso de checklists é muito útil para se automatizar processos. Eu adoro checklists e fluxogramas!

     

    3 – A ajuda dos desenhos e rascunhos na solução de problemas


    image


    Um texto puro e seco, sem nenhuma figura ou diagrama, precisa de muita explicação para ser claro o suficiente e não deixar dúvidas sobre o seu entendimento. Muitas vezes, uma figura, diagrama ou gráfico torna claro um bloco inteiro de texto.


    No caso de problemas de Física, que envolvem movimentos, interações entre objetos e associação de grandezas, ilustrações são essenciais.


    Mesmo que seja um desenho rústico, nada artístico, um rabisco mesmo, feito com caneta e papel, ainda ajuda mais do que apenas ler uma parede de texto. Por exemplo, veja a questão a seguir:


    Um trem de 60 m de comprimento, viajando a 72 Km/h, vai passar por um túnel de 400 m. Quanto tempo o trem levará para passar pelo túnel?

     

    Na matemática é a mesma coisa, questões relacionadas a cálculos, geometria ou lógica matemática ficam muito mais claras com uma figura ilustrativa do que apenas com o enunciado do problema. Um exemplo é a questão seguinte:


    Um quadrado é dividido em 2 retângulos por uma linha horizontal. Qual o ângulo que a diagonal de um dos retângulos formados faz com a sua base?

    a) 45°            b) 26,5º                    c) 30°                        d) 30,5°

    e) depende do tamanho do lado 

     

    No caso da programação, eu tenho visto muitos alunos querendo tirar dúvidas sobre os desafios de código no Discord, nos fóruns e na área de artigos, sobre o entendimento dos enunciados. Um exemplo típico de problema de programação é a Torre de Hanói:


    Dada uma Torre de Hanói com 3 discos, escreva um programa para transferir a pilha de discos da primeira para a terceira torre, seguindo a regra de nunca colocar um disco maior sobre um menor.

              

    Você consegue resolver estes problemas sem fazer um desenho?

     

    4 – As ferramentas digitais para acompanhamento de algoritmos


    image


    A tecnologia avançou muito desde que eu aprendi a fazer testes de mesa, em 1980. Então, você pode perguntar por que eu ainda uso essa técnica antiga de resolver problemas ao invés de usar ferramentas digitais para fazer o mesmo desenho ou diagrama.


    Bem, em algumas situações é mais fácil você ter disponível um papel e uma caneta do que um computador para usar o Paint, Photoshop ou programa semelhante.


    Um exemplo disso foi quando eu fiz um concurso público e uma questão pedia para fazer um acompanhamento de um código e informar o valor de uma variável ao final da sua execução. Fiz o teste de mesa e acompanhei direitinho, acertando a resposta.


    Em outro concurso, tinha uma questão de matemática que tratava da interseção entre figuras geométricas. Um desenho que eu rabisquei no canto da prova esclareceu tudo!


    Além disso, nem todo mundo consegue ser ágil para fazer desenhos claros em uma ferramenta digital com a mesma agilidade que rabisca um desenho no papel.


    No caso da programação, a maioria das IDEs já têm ferramentas de depuração, com acompanhamento de valores de variáveis, execução sequencial do código, execução do código interno de uma função, etc.


    No entanto, em alguns momentos estas ferramentas não estão disponíveis ou são muito complexas para o entendimento básico de um programa simples.

               

    5 – Desenhos usados para ajudar na solução dos problemas


    Aqui vão alguns desenhos feitos à mão, que poderiam ajudar na solução dos problemas exemplificados na seção 3.


    Física - Um trem de 60 m de comprimento, viajando a 72 Km/h, vai passar por um túnel de 400 m. Quanto tempo o trem levará para passar pelo túnel?

      image

     

     

    Matemática - Um quadrado é dividido em 2 retângulos por uma linha horizontal. Qual o ângulo que a diagonal de um dos retângulos formados faz com a sua base?

      image

       


    Programação - Dada uma Torre de Hanói com 3 discos, escreva um programa para transferir a pilha de discos da primeira torre para a terceira torre, seguindo a regra de sempre colocar um disco menor sobre um maior.

      image

     

     E aí, ficou mais fácil de entender os problemas após os desenhos?

     

    6 – Acompanhamento da execução de um programa


    image


    O Teste de mesa propriamente dito representa o acompanhamento da execução de um programa por meio da evolução dos valores de suas variáveis, seguindo o fluxo das instruções que são executadas. É uma simulação de um programa, de forma manual, geralmente feito com papel e caneta.


    Os desenhos e diagramas que foram citados anteriormente ajudam no entendimento do problema a ser representado por um algoritmo, que deve ser codificado em alguma linguagem de programação.


    Com o código escrito em mãos, o teste consiste de seguir o seu fluxo, linha a linha, instrução a instrução, anotando-se os valores atribuídos ás variáveis em cada instrução, até o encerramento do programa. As instruções de saída (escrita) também podem ser anotadas, ajudando no entendimento das saídas e do atendimento ao resultado pedido.


    Como exemplo, vamos ver o seguinte problema:


    Dado um número inteiro, escreva um código que calcule o seu quadrado, se ele for positivo, e calcule o seu cubo, se ele for negativo. No final, escreva o valor lido e o valor calculado. Se o número for zero, escreva zero na saída.

    a) O entendimento do problema fica mais claro com um diagrama (os números mostrados são apenas exemplos):

    image

    b) Agora, vamos elaborar um algoritmo para a solução:

    1. Iniciar o número de entrada;
    2. Testar se o número é positivo, negativo ou zero;
    3. Se for positivo, a solução é o quadrado desse número;
    4.        Se for negativo, a solução é o cubo desse número;
    5.        Se for zero, a solução tem o mesmo valor da entrada
    6. Escrever o valor de entrada
    7. Escrever o valor do resultado

     

    c) Atribuindo variáveis para os valores do algoritmo:


    Número de entrada: num

    Número do resultado: result

     

    d) Traduzindo o algoritmo em pseudo-código:

    num = 4

    result = 0

    se (num > 0) // o número é positivo!

                           result = num * num

    se (num < 0) // o número é negativo!

                           result = num * num * num

    escrever(num)

    escrever(result)

     


    e) Realizando o teste de mesa para a execução deste código, com a entrada igual a 3:


    image

    Esse foi o teste de mesa que eu fiz, à mão, com caneta e papel. Por clareza, eu acho melhor postar figuras dos acompanhamentos feitos no Excel. Em verde, as respostas pedidas.

    image


    f) Realizando o teste de mesa para este código, com entrada igual a -2:


    image


    g) Realizando o teste de mesa para a execução deste código, com a entrada igual a 0:


    image



    Como segundo exemplo, vamos ver problema que tenha uma função e entrada de dados:


    Informe as raízes reais, caso haja, de uma equação de segundo grau, dada por seus coeficientes a, b e c. Ao final, escreva os coeficientes a, b e c, e as raízes encontradas. Se não houver raízes reais, escreva uma mensagem informando esse fato. Os valores dos coeficientes são informados pelo usuário até que um valor zero para o coeficiente a seja informado, encerrando o programa.

    Para saber se há raízes reais, delta deve ser positivo ou zero, se for negativo, não existem raízes reais.

     

    a) O entendimento do problema fica mais claro com uma tabela:


    image

    b) Agora, vamos elaborar um algoritmo para a solução:

    1. Ler valores dos coeficientes;
    2. Escrever os valores dos coeficientes
    3. Se o valor do coeficiente a for zero, encerrar o programa
    4. Calcular o valor de delta;
    5. Testar se o valor de delta é positivo, zero ou negativo;
    6. Se delta for positivo:
    7. Calcular as duas raízes;
    8. Escrever os valores das 2 raízes;
    9. Se delta for zero:
    10. Calcular a raiz única;
    11. Escrever os valores da raiz;
    12. Se delta for negativo:
    13. Escrever “não há raízes reais”;
    14. Ler os próximos coeficientes 

     

    c) Traduzindo o algoritmo em pseudo-código:

    ler( a, b, c )

    escrever( a, b, c )

    enquanto( a != 0 )

    delta = calcularDelta( a, b, c ) // chama a função calcularDelta()

    se ( delta > 0 ) // existem 2 raízes reais

                          raiz1 = ( -b + sqrt( delta ) ) / ( 2 * a );

                          raiz2 = ( -b - sqrt( delta) ) / ( 2 * a );

    escrever( raiz1, raiz2 )

    senão

    se ( delta == 0 ) // existe 1 raiz real

                                      raiz1 = ( -b ) / ( 2 * a );

    escrever( raiz1 )

    senão ( delta < 0 ) // delta < 0. Não existe raiz real

    escrever( “Não existe raiz real” )

     

    d) Função calcularDelta( a, b, c )

    delta = b * b – 4 * a * c

    retornar( delta )

     

    e) Agora vamos fazer o teste de mesa para o programa:

    Em verde, as respostas pedidas, em amarelo, os valores retornados pela função para o programa que a chamou.

    image

    f) Acompanhamento da execução da função calcularDelta():


    Cada vez que a função individual for chamada, a execução passa para as instruções dela, em uma tabela separada, retornando o valor para o programa que chamou.

    image

    7 - Conclusão


    Eu aprendi a programar em 1980, com a linguagem FORTRAN e perfurando cartões! Na época, o acompanhamento da execução de um programa era feito de forma manual, usando uma técnica chamada Teste de Mesa.


    Esse teste ajuda no entendimento do objetivo de um programa, facilita a depuração e ainda serve para o programador iniciante entender o funcionamento de um programa, a dinâmica das variáveis e o fluxo de sua execução.


    Neste artigo, foi mostrado o que é e como fazer o teste de mesa. Além disso, foram mostradas outras técnicas adicionais para melhorar o entendimento de problemas e a implementação das soluções, usando o computador.


    Estas técnicas são a elaboração de algoritmos, a divisão e conquista, o uso de desenhos e a interpretação atenta do texto dos enunciados.


    O teste de mesa é uma técnica muito antiga, já superada pelas ferramentas modernas disponíveis, mas ainda pode ser bem útil para os iniciantes na programação ou mesmo na resolução de questões de acompanhamento da execução de códigos em questões de concursos.

     

    Obrigado por ler até aqui, até o próximo artigo!

     

    Compartilhe
    Comentários (2)
    Luiz Café
    Luiz Café - 08/03/2023 17:33

    Ótimo artigo Fernando! Gostei bastante de aprender sobre o teste de mesa. Na minha opinião ele deveria continuar a ser utilizado pois o aprendizado é muito grande.

    Uma pena que vivemos em um mundo rápido demais, buscando a resposta pronta sem entender a lógica por trás do código.

    Arnaldo Junior
    Arnaldo Junior - 08/03/2023 16:44

    Fernando, você se diz Jurassico por utilizar teste de mesa, então somos, pois estou na área desde 84 e também aprendi assim a usar programação e até hoje uso para ensinar alunos a pensarem de forma lógica.


    É sim uma excelente ferramenta e uma forma ótima de demonstrar as alterações de valores que as variáveis passam durante a execução de um programa.


    Parabéns pela matéria.