Por forma a validar o correto funcionamento das aplicações realizadas pelos alunos, o corpo docente da disciplina de Programação com Objectos aplica um conjunto de testes de software que são executados de forma autoática aos projetos submetidos pelos alunos. O corpo docente disponibiliza um conjunto de testes públicos que os alunos podem aplicar durante o desenvolvimento da aplicação por forma a corrigirem erros que a aplicação tenha. Este conjunto de testes públicos apenas verifica parte das funcoinalidades que a aplicação deve suportar. É da responsabilidade de cada grupo verificar se as restantes funcionaldiades estão correctamente concretizadas ou não e corrigir as que estejam erradas. É disponibilizado um ficheiro que indica o que funcionaldiade é que cada teste está a verificar.

Na avaliação dos projectos, o corpo docente correr dois conjuntos de testes de software, o público e o privado, por forma a determinar a nota de cada projecto na componente da avaliação automática. Todos os testes têm o meso peso 

Cada teste é constituído por dois ou três ficheiros: 

  • um ficheiro que define a entrada a submeter ao projecto (extensão .in). Este ficheiro simula um utilizador e contém todos os dados que um utilizador deveria introduzir para realizar a funcionalidade que se pretende exercitar no teste em causa;
  • um ficheiro (com extensão .out) que define o resulta esperado da execução do projecto neste caso de teste. Este ficheiro contém todos os dados que a aplicação deve escrever quando se submete como entrada o conteúdo do ficheiro com os dados de entrada;
  • e um ficheiro opcional (com extensão .import). Este ficheiro opcional define um conjunto de dados que devem ser processados inicialmente pela aplicação antes de esta começar a processar os dados no ficheiro de entrada. Este ficheiro de import permite colocar a aplicação num determinado estado inicial antes de começar a processar os dados de entrada. 
Após ser aplicado um teste, considera-se que o teste passou com sucesso (ou seja, a aplicação teve o comportamento esperado) caso os dados escritos via classe Display pela aplicação durante a exceução do teste sejam iguais ao esperado, ou seja, iguais ao conteúdo do ficheiro de teste com a extensão out. Caso sejam diferentes, o teste falhou.

As aplicações desenvolvidas utilizando a framework po-uilib já suportam as propriedades Java in e out. Quando se atribui um valor à propriedade in no comando de execução da aplicação, a aplicação vai obter todos os dados de entrada a serem utilzados através do ficheiro indicado como valor da propriedade in. Por esta razão todos os pedidos de leitura de dados da aplicação devem ser feitos através da classe Form. Caso isto não seja respeitado, então os testes não vão correr de forma correcta e irão falhar.

Quando se atribui um valor à propriedade out, todos os dados escritos pela  aplicação através da classe Display da framework po-uilib são guardados no ficheiro incado no valor desta propriedade. Assim, todos os dados escritos através de System.out são ignorados do ponto de vista dos testes e apenas devem ser utilizados como um mecanismo de debugging e de preferência devem ser eviitados na versão final da aplicação.

O ficheiro import a utilizaar deve ser indicado através da propriedade import mas esta, ao contrário das outras duas, não tem qualquer suporte pela framework po-uilib. É da responsabilidade do programador concretizar como é que o ficheiro de import (caso exista) deve ser processado pela aplicação. Este processamento deve estar concretizado através de uma classe do domínio da aplicação. Normalmente a classe de entrada da aplicação apenas verifica se esta propriedade está definida e caso esteja então invoca a o método em causa da classe do domínio da aplicação que é responsável por fazer este processamento passando como argumento o valor da proprieadade import. Para saber o valor atribuído a uma propriedade pode-se utilizar o método estático getProperty da classe System. Este método devolve o valor associado à propriedade com o nome indicado no parâmetro do método. Caso não haja nenhum valor atribuído, o método devolve a referência nula (null).

A execução de um teste de software constituído pelos ficheiros test.in, test.out e test.import, deve ser realizada da seguinte forma. Primeiro, executa-se o projecto tendo em conta os valores de entradas definidos pelo teste, utilizando o seguinte comando (assume-se que o comando é executado no mesmo directório que contém o directório do pex do projecto e que o ponto de entrada da aplicação é a classe ex.app.App):

        java -cp po-uilib.jar:. -Dimport=test.import -Din=test.in -Dout=test.outhyp ex.app.App


De seguida, verifica-se se a execução da aplicação nas condições indicadas pelos ficheiros de entrada teve o resultado esperado. Este requisito é verificado comparando o ficheiro de saída produzido pela execução do teste é igual ao esperado (e indicado pelo ficheiro com a extensão .out). Em Linux, para comparar os ficheiros utiliza-se o programa diff:

        diff -cBw test.out test.outhyp

Tendo em conta a forma como os testes de software automáticos são realizados, é fundamental que a aplicação desenvolvida concretize a interacção com o utilizador através das classes Form (para ler dados) e Display (para escrever dados) da framework po-uilib. Caso a aplicação desenvolvida não esteja de acordo com estas duas restrições haverá casos de teste automáticos que poderão falhar apenas devido ao facto de o redirecionamento da entrada e saída de dados da aplicação não ser possível de fazer nas situações em que o programa lê ou escreve dados sem utilizar as classes Form e Display (por exemplo, todos os dados escritos via System.out são ignorados).   É da responsabilidade dos alunos garantir que isto não acontece com dados que devem ser escritos ou lidos de acordo com os requisitos da aplicação, caso contrário terão uma avaliação de 0 (zero) em todos os testes que falhem.

Em sistemas UNIX (Linux e Mac OSX), pode utilizar o seguinte script para executar de forma automática os testes disponibilizados: runtests.sh. Este script supõe que os ficheiros de cada caso de teste estão guardados no sub-directório tests presente no directório onde este script está a ser executado. Para correr os testes bastará executar o script runtests.sh. A execução do script gerará para cada teste falhado dois ficheiros: um que contém o resultado da execução da aplicação que está a ser testada para o teste em causa (e que tem extensão outhyp) e outro que contém as diferenças entre o resultado esperado para o teste falhado e o resultado obtido através da execução da aplicação (e que tem extensão .diff). Estes ficheiros são guardados dentro do directório tests. 

Este script (e directório tests que contém os ficheiros de teste) devem estar no mesmo directório raiz que contém o código da aplicação. O script supõe ainda que este directório contém o ficheiro po-uilib.jar (a framework de interação com o utilizador). Caso isto não aconteça, então a execução irá falhar porque haverá classe da aplicação que não conseguem ser encontradas pela máquina virtual do Java.