Cadastro de testes unitários

Como os testes unitários são definidos/implementados?

ADS.CAD_TESTE_UNITARIO.FAQ-707
Os testes unitários podem ser implementados em vários escopos diferentes. Podem ser definidos basicamente em requisitos, domínios, entidades, interfaces e bibliotecas. A idéia é que qualquer comportamento específico seja testado e que este teste seja definido antes de sua implementação.

Onde o teste é colocado é uma questão de organização apenas. Tecnicamente, não existe nada que impeça que se verifique o comportamento de um elemento em um teste que está armazenado abaixo de outro elemento. Claro que isso deve ser evitado.

Definir o que deve ser testado já é um grande começo mesmo que ainda não se saiba como isso deve ser testado. Uma vez definido que existe algo a ser testado, o Telescope já irá inserir este teste na lista de testes do sistema e o resultado de sua execução dará o erro "NOT IMPLEMENTED!" e isso servirá como alerta para a equipe de desenvolvimento que este teste deve ser implementado.

Ao cadastrar um teste, forneça um nome qualquer para ele. Os nomes são utilizados para sequenciar os testes dentro do sistema e sugerimos o uso de nomes do tipo "TU-001", "TU-002", "TU-003", etc. O título do teste é o que é utilizado para identificar o que está sendo testado e aparece nos relatórios de execução. A descrição é um texto opcional livre que explica como o teste deverá ser feito.

A implementação do teste unitário é apenas uma rotina que executará uma sequencia de operações e cujos resultados são medidos. Para reportar se os resultados obtidos são os esperados deve-se utilizar os seguintes métodos:

assertTrue(String mensagem, boolean resultado)
assertEquals(String mensagem, Object esperado, Object obtido)
error(String mensagem)

Uma rotina de testes pode reportar vários resultados intermediários. O teste como um todo será considerado OK apenas se todos os resultados forem positivos e que a rotina não dispare uma exceção.

Exemplo 1: Para facilitar a comparação entre duas datas, foi implementado um método COMPARE_TO no domínio DATE. Um teste unitétio deste método testaria alguns exemplos da seguinte forma:

DomDate d1 = new DomDate();
d1.setValue("28/02/2007");
DomDate d2 = new DomDate();
d2.setValue("28/02/2007 23:00");
DomDate d3 = new DomDate();
d3.setValue("01/03/2007 12:00");
DomDate d4 = new DomDate();
d4.setValue("28/02/2008 23:00");
DomDate d5 = new DomDate();
d5.setValue("01/03/2008 12:00");
assertEquals(d1.toText() + " - " + d2.toText(), 0l, d1.compareTo(d2.getValue()));
assertEquals(d1.toText() + " - " + d3.toText(), -1l, d1.compareTo(d3.getValue()));
assertEquals(d3.toText() + " - " + d2.toText(), 1l, d3.compareTo(d2.getValue()));
assertEquals(d4.toText() + " - " + d5.toText(), -2l, d4.compareTo(d5.getValue()));

Exemplo 2: No sistema de indicadores de qualidade, existe uma rotina que gera os períodos de controle dos indicadores. Antes de se implementar a rotina, eu criei um teste que verificava se o resultado obtido era o desejado. Defini como teste a geração de todos os períodos do ano de 1990. Em seguida, verifiquei se os registros resultantes eram os esperados e por fim exclui todos estes períodos. A implementação feita foi a seguinte:

// import java.util.GregorianCalendar;
// import java.sql.Date;
int meses = 12;
EntPeriodosAvaliacao periodo = new EntPeriodosAvaliacao(ctx);
GregorianCalendar cal = new GregorianCalendar();
cal.set(1990,0,1);
for (int i=0; i<meses; i++) {
    periodo.gerarPeriodo(new Date(cal.getTime().getTime()));
    cal.add(cal.MONTH,1);
}
assertTrue("Gerados os períodos de 1990");
StringBuilder str = new StringBuilder();
periodo.find("select id from periodos_avaliacao" +
        " where periodo_avaliacao like '1990-%'" +
        " order by periodo_avaliacao");
while (periodo.next()) {
    str.append(periodo.valueOfPeriodoAvaliacao() + " " +
            periodo.valueOfDataInicial() + "-" +
            periodo.valueOfDataFinal() + ",");
}
assertEquals("Períodos gerados",
      "1990-01 1990-01-01 00:00:00.0-1990-01-31 23:59:59.999," +
      "1990-01-1 1990-01-01 00:00:00.0-1990-01-15 23:59:59.999," +
      "1990-01-2 1990-01-16 00:00:00.0-1990-01-31 23:59:59.999," +
      "1990-02 1990-02-01 00:00:00.0-1990-02-28 23:59:59.999," +
      "1990-02-1 1990-02-01 00:00:00.0-1990-02-15 23:59:59.999," +
      "1990-02-2 1990-02-16 00:00:00.0-1990-02-28 23:59:59.999," +
      "1990-03 1990-03-01 00:00:00.0-1990-03-31 23:59:59.999," +
      "1990-03-1 1990-03-01 00:00:00.0-1990-03-15 23:59:59.999," +
      "1990-03-2 1990-03-16 00:00:00.0-1990-03-31 23:59:59.999," +
      "1990-04 1990-04-01 00:00:00.0-1990-04-30 23:59:59.999," +
      "1990-04-1 1990-04-01 00:00:00.0-1990-04-15 23:59:59.999," +
      "1990-04-2 1990-04-16 00:00:00.0-1990-04-30 23:59:59.999," +
      "1990-05 1990-05-01 00:00:00.0-1990-05-31 23:59:59.999," +
      "1990-05-1 1990-05-01 00:00:00.0-1990-05-15 23:59:59.999," +
      "1990-05-2 1990-05-16 00:00:00.0-1990-05-31 23:59:59.999," +
      "1990-06 1990-06-01 00:00:00.0-1990-06-30 23:59:59.999," +
      "1990-06-1 1990-06-01 00:00:00.0-1990-06-15 23:59:59.999," +
      "1990-06-2 1990-06-16 00:00:00.0-1990-06-30 23:59:59.999," +
      "1990-07 1990-07-01 00:00:00.0-1990-07-31 23:59:59.999," +
      "1990-07-1 1990-07-01 00:00:00.0-1990-07-15 23:59:59.999," +
      "1990-07-2 1990-07-16 00:00:00.0-1990-07-31 23:59:59.999," +
      "1990-08 1990-08-01 00:00:00.0-1990-08-31 23:59:59.999," +
      "1990-08-1 1990-08-01 00:00:00.0-1990-08-15 23:59:59.999," +
      "1990-08-2 1990-08-16 00:00:00.0-1990-08-31 23:59:59.999," +
      "1990-09 1990-09-01 00:00:00.0-1990-09-30 23:59:59.999," +
      "1990-09-1 1990-09-01 00:00:00.0-1990-09-15 23:59:59.999," +
      "1990-09-2 1990-09-16 00:00:00.0-1990-09-30 23:59:59.999," +
      "1990-1 1990-01-01 00:00:00.0-1990-06-30 23:59:59.999," +
      "1990-10 1990-10-01 00:00:00.0-1990-10-31 23:59:59.999," +
      "1990-10-1 1990-10-01 00:00:00.0-1990-10-15 23:59:59.999," +
      "1990-10-2 1990-10-16 00:00:00.0-1990-10-31 23:59:59.999," +
      "1990-11 1990-11-01 00:00:00.0-1990-11-30 23:59:59.999," +
      "1990-11-1 1990-11-01 00:00:00.0-1990-11-15 23:59:59.999," +
      "1990-11-2 1990-11-16 00:00:00.0-1990-11-30 23:59:59.999," +
      "1990-12 1990-12-01 00:00:00.0-1990-12-31 23:59:59.999," +
      "1990-12-1 1990-12-01 00:00:00.0-1990-12-15 23:59:59.999," +
      "1990-12-2 1990-12-16 00:00:00.0-1990-12-31 23:59:59.999," +
      "1990-2 1990-07-01 00:00:00.0-1990-12-31 23:59:59.999," +
      "",
      str.toString());
periodo.del("select id from periodos_avaliacao" +
       " where periodo_avaliacao like '1990-%'" +
       " order by periodo_avaliacao");
assertTrue("Exclusão dos períodos de 1990");