Ferramenta de Testes de Programas para Auxílio na Aprendizagem de Programação Denise Santiago (FURB) denise@senior.com.br Maurício Capobianco Lopes (FURB) mclopes@furb.br Resumo. Este artigo apresenta uma ferramenta de apoio para testes de programas utilizando o teste de validação, com o intuito de auxiliar os alunos no aprendizado de programação. Através da ferramenta o aluno pode testar de forma on-line os seus programas com casos de testes previamente preparados pelo professor. Palavras-Chave: Ensino-Aprendizagem de Programação, Testes de Software. 1 Introdução O potencial e os recursos de informática existentes atualmente tornaram-se fundamentais para os processos de ensino. Segundo Sanderink (2002), o uso do computador em modelos de ensino-aprendizagem permite que os alunos realizem um processo interativo de aprendizado, uma vez que eles podem usá-lo no seu próprio ritmo e em qualquer momento. No ensino de programação de computadores existem diversas maneiras de auxiliar o aluno na resolução de problemas de programação. Assim, este artigo apresenta uma ferramenta que possibilita ao aluno testar seus programas e verificar se o mesmo atende os requisitos projetados para o mesmo. O teste de software é uma das áreas de pesquisa da Engenharia de Software que constitui um dos elementos principais para aprimorar a produtividade e ajudar a fornecer evidências da confiabilidade dos sistemas. A realização dos testes pode ser planejada e executada através de métodos que os auxiliam a se tornar mais eficazes e eficientes. Os conceitos sobre teste de software podem ser muito úteis para os alunos de uma disciplina de programação, uma vez que o aluno, nesta fase do aprendizado, dispõe de poucos recursos ou conhecimento para testar adequadamente todos os possíveis casos de erro em seu sistema. Assim, além de apontar os casos de teste não solucionados pelo programa, o aluno já irá adquirindo uma conscientização sobre a importância de um bom teste para assegurar a qualidade do software desenvolvido. Segundo Hetzel (1987) o teste é um processo de aquisição de confiança no fato de que um programa ou sistema faz o que se espera dele, ou seja, é o processo de se experimentar ou avaliar um sistema por meios manuais ou automáticos, de
modo a verificar se ele atende às necessidades especificadas ou a identificar as diferenças entre os resultados esperados e reais. Dentro dos conceitos da Engenharia de Software, encontram-se vários tipos de teste de software, entre eles o teste de validação, também conhecido como teste de aceitação. O objetivo deste teste é assegurar que as funções do sistema atinjam os objetivos esperados e de forma correta. Um plano de teste esboça as classes de testes a serem realizadas e um procedimento de teste define os casos de teste específicos que serão usados para demonstrar a conformidade com os requisitos (Pressman, 1995). Deste modo, este artigo apresenta uma ferramenta desenvolvida para auxiliar o aluno nos testes dos exercícios propostos em uma disciplina de programação utilizando o teste de aceitação/validação. Para isto é disponibilizado um banco de dados de exercícios, através do qual o aluno pode selecionar e resolver um exercício, submetendo o seu programa à ferramenta para verificar se o mesmo está correto. A ferramenta disponibiliza ao aluno os resultados dos testes realizados em seu programa. No caso de erro o aluno pode corrigir o programa e imediatamente submeter a nova correção. Para a implementação da ferramenta proposta neste trabalho foram utilizados os componentes da biblioteca CLX que foi incluída na versão 6.0 do ambiente de desenvolvimento Delphi e, como o sistema deve operar de forma distribuída em uma rede local, foi utilizada a tecnologia CORBA, o que facilita o desenvolvimento de um módulo específico para o professor e outro módulo para uso dos alunos, operando em um laboratório de informática, por exemplo. Mais detalhes sobre o desenvolvimento deste trabalho podem ser vistos em Santiago (2002). 2 Testes de Software Segundo Inthurn (2001) existem várias atividades que podem ser utilizadas no processo de desenvolvimento do software para garantir a qualidade do produto final, porém, apesar de todos os métodos, técnicas e ferramentas utilizadas, falhas no produto podem ocorrer. Dessa forma, dentro do processo de desenvolvimento, a etapa de teste é de grande importância para a identificação e eliminação de erros. Para Paula Filho (2001) os testes de software devem ser cuidadosamente desenhados e planejados, para garantir a eficácia dos mesmos. Durante e após a realização dos testes, deve-se inspecionar os resultados, comparando os resultados previstos com os obtidos, para garantir um nível adequado de confiança de que o software atinge os seus requisitos, contribuindo para a qualidade do produto. Rocha (2001) destaca que são quatro as etapas envolvidas pela atividade de teste: planejamento, projeto de casos de teste, execução e avaliação dos resultados. Este trabalho enfoca as fases de execução e avaliação dos resultados, ficando para implementações futuras o planejamento e o projeto de casos de teste. A atividade de teste, segundo Paula Filho (2001) pode ser classificada em:
a) teste de unidade: verifica se um elemento pode ser logicamente tratado como uma unidade de implementação, como uma sub-rotina, um módulo ou uma classe; b) teste de integração: verifica se as unidades testadas de forma individual executam corretamente quando integradas; c) teste de aceitação: também conhecido como teste de validação, verifica se o software atende os requisitos especificados. Paula Filho (2001) complementa esta classificação definindo dois tipos de métodos: a) método da caixa branca ou teste estrutural: determina defeitos na estrutura interna do software através de casos de testes que exercitem os possíveis caminhos de execução; b) método da caixa preta ou teste funcional: determina se os requisitos são total ou parcialmente satisfeitos pelo software. Esses testes não verificam como ocorre o processo, mas apenas os resultados obtidos. Dessa forma os testes de unidade geralmente são de caixa branca, os testes de aceitação geralmente são de caixa preta e os testes de integração costumam misturar testes de caixa preta e caixa branca. A ferramenta proposta neste trabalho utiliza o teste de aceitação para verificar se os programas desenvolvidos pelo aluno estão corretos. Segundo Pressman (1995) este tipo de teste é bem sucedido quando o software funciona de uma maneira razoavelmente esperada. Para a realização dos testes de aceitação, deve-se definir os casos de testes que serão submetidos ao software e os resultados esperados para as respectivas entradas. Isto é uma característica dos testes de caixa preta, que demonstram a conformidade do sistema com os requisitos, para que a validação do software seja realizada. 3 A Ferramenta Desenvolvida Conforme comentado anteriormente, a ferramenta apresentada neste artigo aplica um método de teste de caixa preta para efetuar a correção dos exercícios submetidos pelos alunos em uma disciplina de programação. Assim, ao concluir um exercício proposto pelo professor, o aluno pode submete-lo à correção. A partir de um conjunto de dados de entrada padrão, o sistema irá comparar os resultados alcançados pelo programa do aluno com os resultados esperados, informando ao aluno se o programa atende ou não as especificações do enunciado. A ferramenta está dividida em dois módulos distintos: a) módulo do professor: neste módulo são cadastrados os alunos que podem ter acesso aos exercícios, bem como podem ser cadastrados os exercícios e verificadas suas correções;
b) módulo do aluno: através deste módulo o aluno tem acesso aos exercícios disponibilizados pelo professor, pode enviar o seu exercício e verificar os erros existentes. A especificação do sistema foi feita utilizando-se alguns diagramas da UML. A ferramenta CASE utilizada para esta especificação foi o Rational Rose, devido aos recursos disponíveis para aplicar as representações da UML, como o Diagrama de Classes, o Diagrama de Casos de Uso e o Diagrama de Seqüência (Furlan, 1998). A Figura 1 apresenta os principais casos de uso do sistema. Figura 1 Diagrama de Casos de Uso Os casos de uso serão detalhados logo a seguir. Já a Figura 2 demonstra o diagrama de classes do sistema. Figura 2 Diagrama de Classes
Foram identificadas as seguintes classes no sistema: a) aluno: responsável por manter as informações dos alunos. Apenas alunos cadastrados podem ter acesso aos exercícios; b) exercício: responsável por manter as informações sobre os exercícios cadastrados pelo professor; c) testes: é uma agregação da classe exercício, uma vez que um exercício pode ter vários casos de testes; d) entrega: responsável por manter as informações sobre os exercícios enviados pelo aluno. O aluno pode enviar o mesmo exercício várias vezes; e) resultados: responsável pelas informações sobre a correção do exercício. Os resultados armazenados são específicos para cada caso de teste submetido ao programa. Os diagramas de seqüências do sistema podem ser vistos com detalhes em Santiago (2002). A seguir será detalhado o uso do sistema, segmentando a apresentação a partir dos casos de uso identificados. 3.1 Cadastrar aluno Neste caso de uso é realizada a entrada dos dados referentes aos alunos da disciplina de programação. Somente através do módulo do professor é que os alunos podem ser cadastrados. O professor deve cadastrar todos os alunos que podem ter acesso ao módulo do Aluno, conforme mostra a Figura 3. Figura 3 Cadastro de alunos do módulo Professor Nesta tela o professor informa o código do aluno, seu nome completo, uma senha e o diretório do aluno no servidor. Através desta tela o professor pode incluir, alterar e excluir alunos. A informação do diretório é muito importante, pois quando o aluno submeter o seu exercício para correção o sistema vai gravar o código fonte, o executável e os resultados obtidos, neste diretório.
3.2 Cadastrar Exercício Neste caso de uso é realizada a entrada dos dados referentes aos exercícios. Somente através do módulo do professor é que os exercícios podem ser cadastrados. O professor cadastra os exercícios através do método CadastrarExercício da classe Exercício, informando o código do exercício, o nome do documento texto que contém o enunciado do exercício, uma pequena descrição do exercício, o diretório onde está gravado esse documento, uma data limite para a entrega e se o aluno pode visualizar os testes, conforme a Figura 4. Figura 4 Cadastro de Exercícios do módulo Professor Nesta tela, algumas informações são muito importantes para o funcionamento da ferramenta, como o nome do exercício. Esse nome corresponde ao nome do arquivo que contém o enunciado do exercício. A informação do diretório também é importante, pois corresponde ao diretório no servidor onde o enunciado do exercício está gravado. É através dessas duas informações que a ferramenta vai localizar o exercício para enviar ao módulo do Aluno. A data limite indica para o aluno o prazo que ele tem para a entrega do exercício. A ferramenta permite que o aluno entregue o exercício mesmo após a data especificada pelo professor, porém este pode verificar os alunos que entregaram o exercício com atraso através da consulta de resultados. O campo visualiza testes indica se o aluno pode receber os arquivos de entrada que não geraram as saídas esperadas quando submetidos ao programa enviado. Se este campo estiver preenchido com N o aluno apenas recebe a informação sobre o número de erros e o número de acertos que obteve, não tendo a indicação sobre quais circunstâncias os erros ocorreram. Através do botão Testes mostrado na Figura 4 o professor deve cadastrar os casos de testes para o exercício. Para isto, ele deve informar uma seqüência para o teste, o nome do arquivo texto que contém os dados de entrada, o nome do arquivo texto que contém os dados esperados na saída e o diretório onde esses arquivos
estão armazenados no servidor de arquivos. A tela de cadastro de testes é apresentada na Figura 5 Figura 5 Cadastro de Testes Todas as informações desta tela também são utilizadas para a correção dos exercícios submetidos pelos alunos. Para cada exercício cadastrado é possível relacionar vários arquivos de casos de testes (entradas e saídas). Os arquivos de entrada e saída devem ser preparados pelo professor que deve informar ao aluno o formato das informações inseridas nos mesmos através do enunciado do exercício. 3.3 Carregar Exercício O aluno acessa o seu módulo através do método ValidarAluno. Esse método solicita o código do aluno e sua senha e verifica se o aluno está cadastrado no sistema e se a senha informada confere com a cadastrada, permitindo assim o acesso às funcionalidades do módulo. Acessando o módulo, o aluno pode, através do método CarregarExercicio verificar quais os exercícios estão disponibilizados pelo módulo do professor. Ao acessar essa tela a ferramenta já carrega uma lista com todos os exercícios cadastrados pelo módulo do professor, conforme a Figura 6. Figura 6 Tela de Seleção de Exercícios do módulo Aluno
Nesta tela o aluno pode verificar todas as informações sobre os exercícios cadastrados pelo professor e selecionar qual o exercício deseja fazer o download do enunciado. Para fazer o download basta posicionar o cursor sobre o exercício desejado na lista e clicar no botão Download. O sistema apresenta a tela de download como mostra a Figura 7. Figura 7 Download do exercício O sistema já carrega as informações do endereço do servidor e o caminho e nome do arquivo onde está o enunciado do exercício selecionado. O aluno apenas deve informar o caminho e o nome do arquivo a ser gerado no seu computador. Ao clicar no botão Download o módulo do aluno irá realizar a transferência do arquivo para o diretório informado no campo Arquivo no Cliente. 3.4 Corrigir Exercício Neste caso de uso o aluno envia a resolução do programa desenvolvido por ele, para que a ferramenta possa corrigí-lo e recebe uma resposta com os casos de testes não aceitos pela ferramenta. Inicialmente o aluno envia o exercício implementado e a classe Entrega grava as informações através do método AutenticarEntrega. A tela de envio é muito semelhante à tela de seleção de exercícios (Figura 8). Figura 8 Seleção de Exercícios para correção
Para enviar a resolução do exercício, o aluno deve posicionar o cursor sobre o mesmo e clicar no botão Upload (Figura 9). Figura 9 Envio do Exercício A ferramenta carrega automaticamente as informações do endereço do servidor de arquivos e do diretório do aluno neste servidor. É neste diretório que o programa enviado é gravado. O aluno deve informar o diretório no seu computador onde está o exercício resolvido e o nome do arquivo. Com estas informações preenchidas basta clicar no botão Upload para transferir o arquivo. A classe Entrega recebe as informações sobre os casos de testes que devem ser aplicados ao programa e efetua a autenticação da entrega, gravando um registro em uma tabela de entregas com as seguintes informações: código do aluno, código do exercício, seqüência da entrega, data de entrega e nome do exercício enviado. A ferramenta efetua, então, os testes, através do método CorrigirExercício (Quadro 1), executando o arquivo recebido e submetendo todos os casos de testes cadastrados para o exercício em questão ao programa enviado pelo aluno. Automaticamente são comparados os arquivos de saída gerados pela solução do aluno com os arquivos de saídas corretos que estão armazenados no servidor para verificar o número de erros e o número de acertos que o aluno obteve. Para cada caso de teste submetido são registradas, em uma tabela de Resultados, as informações sobre o código do aluno, códigos do exercício, seqüência da entrega, número do caso de teste, número de acertos e número de erros, permitindo, assim, manter uma estatística da situação do aluno, para cada exercício. try Saida1 := TStringList.Create; Saida2 := TStringList.Create; QueryAlu := TQuery.Create(nil); QueryAlu.DatabaseName := 'TCCDenise'; QueryAlu.SQL.Add('SELECT DIRALU FROM ALUNO WHERE CODALU=:CODALU'); QueryAlu.ParamByName('CodAlu').AsString := _CodAlu;
QueryAlu.Open; Query := TQuery.Create(nil); Query.DatabaseName := 'TCCDenise'; Query.SQL.Add('SELECT * FROM TESTES WHERE CODEXE = :CODEXE'); Query.ParamByName('CodExe').AsInteger := _CodExe; Query.Open; Caminho1:='C:'+QueryAlu.FieldByName('DirAlu').AsString+'\'+_NomExe; while not(query.eof) do begin CaminhoFinal:= 'C:' + Query.FieldByName('DirTes').AsString + '\'; VarAux := Caminho1 + ' ' + CaminhoFinal; winexec(pchar(varaux),sw_hide); //Compara a Saida gerada com a Saida correta VNumAce := 0; VNumErr := 0; Arq1 := CaminhoFinal + 'Sai01.txt'; Arq2 := CaminhoFinal + 'S' + _CodAlu + '.txt'; Saida1.Clear; Saida2.Clear; Saida1.LoadFromFile(Arq1); Saida2.LoadFromFile(Arq2); for i:= 0 to Saida1.Count - 1 do if (Saida1.Strings[i] <> Saida2.Strings[i]) then inc(vnumerr) else inc(vnumace); QueryUpd := nil; try QueryUpd := TQuery.Create(nil); QueryUpd.DatabaseName := 'TCCDenise'; QueryUpd.SQL.Add('INSERT INTO RESULTADOS (CODALU,CODEXE,SEQENT,NUMTES,NUMACE,NUMERR) ' + 'VALUES (:CODALU,:CODEXE,:SEQENT,:NUMTES,:NUMACE,:NUMERR)'); QueryUpd.ParamByName('CodAlu').AsString := _CodAlu; QueryUpd.ParamByName('CodExe').AsInteger := _CodExe; QueryUpd.ParamByName('SeqEnt').AsInteger := _SeqEnt; QueryUpd.ParamByName('NumTes').AsInteger := Query.FieldByName('NumTes').AsInteger; QueryUpd.ParamByName('NumAce').AsInteger := VNumAce; QueryUpd.ParamByName('NumErr').AsInteger := VNumErr; QueryUpd.ExecSQL; finally QueryUpd.Free; end; Query.Next; end; finally Query.Free; QueryAlu.Free; Saida1.Free; Saida2.Free; end; Quadro 1 Método Corrigir Exercício Através do método EnviarResultados os resultados são, então, armazenados e é enviado ao aluno uma resposta indicando o tempo de execução do seu exercício e quantos erros e acertos ele obteve, preenchendo, assim, os três últimos campos da tela apresentada na Figura 9.
3.5 Verificar Correções Após o sistema registrar a correção dos exercícios submetidos pelo aluno, o Professor pode consultar essas correções para verificar a situação do aluno. O professor seleciona o aluno sobre o qual deseja verificar as correções. Com a informação do aluno a classe Entrega recebe as informações sobre os resultados através do método ReceberResultados e apresenta os resultados dos testes para o professor utilizando o método MostrarResultados. Na tela apresentada na Figura 10 o professor pode verificar as entregas de exercícios de cada um dos alunos cadastrados. Para isso ele deve informar o código do aluno e pressionar o botão Mostrar. O sistema mostra a lista de todas as entregas feitas pelo aluno selecionado. Figura 10 Tela de Consulta de Resultados As informações disponíveis nessa tela são o número do cadastro do exercício, o nome do documento onde está o enunciado do exercício, a data limite para a entrega do exercício, o número da entrega feita pelo aluno, a data que o aluno fez a entrega do exercício, o número do arquivo de teste submetido ao exercício, o número de acertos que o aluno obteve com a entrega, o número de erros que o aluno obteve com a entrega e o tempo em que o programa do aluno foi executado. 4 Considerações Finais O objetivo principal do trabalho, que era desenvolver uma ferramenta de apoio para testes de programas utilizando o teste de validação, foi alcançado com sucesso. A ferramenta foi desenvolvida e os casos de testes de validação podem ser aplicados nas correções dos programas submetidos pelos alunos. Em um método tradicional de ensino de programação, normalmente o professor fornece os exercícios em sala de aula para os alunos resolverem, estipulando um prazo de entrega. Após desenvolver e entregar o exercício o aluno não tem um feedback instantâneo do resultado. Muitas vezes, o próprio aluno não
tem experiência nem conhecimento para preparar casos de teste para validar o programa desenvolvido. Com a disponibilização desta ferramenta em uma disciplina de programação, o professor tem melhores condições de acompanhar o desenvolvimento dos alunos em relação aos exercícios, além de propiciar que o aluno possa receber o resultado do seu trabalho logo após o envio do mesmo, além de testar o programa com casos de testes que efetivamente permitam a validação do mesmo. Obviamente que a preparação do exercício e dos casos de teste continuam como responsabilidade do professor onde o mesmo deve observar os aspectos relevantes para os procedimentos de testes. Assim, algumas extensões para este trabalho serão aprimorar o módulo do professor, desenvolvendo uma ferramenta para auxiliar o professor na geração dos casos de testes, além de desenvolver regras para calcular uma nota para o aluno baseando-se nos seus acertos, erros e número de vezes que o aluno submeteu os exercícios. Referências bibliográficas FURLAN, José Davi. Modelagem de objetos através da UML. São Paulo: Makron Books, 1998. HETZEL, William. Guia completo ao teste de software. Rio de Janeiro: Campus, 1987. INTHURN, Cândida. Qualidade & teste de software. Florianópolis: Visual Books, 2001. PAULA FILHO, Wilson de Pádua. Engenharia de software. Fundamentos, métodos e padrões. Rio de Janeiro: LTC, 2001. PRESSMAN, Roger S. Engenharia de software. São Paulo: Makron Books, 1995. ROCHA, Ana Regina Cavalcanti da; MALDONADO, José Carlos; WEBER, Kival Chaves. Qualidade de Software Teoria e Prática. São Paulo: Prentice Hall, 2001. SANDERINK, Gerard C.H. Tendências no aprendizado com o auxílio do computador: das aulas para as virtuais salas de aula. Disponível em < http://www.tpo.com.br/xijabro/sanderink-traducao.doc >. Acesso em 15 Mai. 2002. SANTIAGO, Denise Ferramenta para testes de programas utilizando componentes da biblioteca CLX. 2002. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) - Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.