Como o FIT funciona FIT: Framework for Integrated Tests http://fit.c2.com Dados de testes Fixtures Programa classes FIT Resultados de testes Universidade Portucalense Engenharia de Software ES04 2014-2015 1
ColumnFixture Para testar regras e cálculos Fixtures Cada caso define valores de campos, métodos a invocar, e os resultados esperados RowFixture Para testar resultados que são coleções de objetos ActionFixture Para testar sequências de ações Há outros tipos de fixtures. Estes três são os originais e mais significativos. Universidade Portucalense Engenharia de Software ES04 2014-2015 2
ColumnFixture (1) Uma tabela HTML baseada numa ColumnFixture Cada título de coluna deve corresponder a um atributo ou método na fixture associada Cada linha descreve um caso de teste Uma ColumnFixture executa os testes linha a linha, de cima para baixo Cada linha é executada da esquerda para a direita Um título de coluna que não termine em () nem? é interpretado como o nome de um atributo; o valor na célula dessa coluna é atribuído ao atributo Um título de coluna que termine em? ou () é interpretado como o nome de um método; o valor na célula é o resultado esperado da execução do método Universidade Portucalense Engenharia de Software ES04 2014-2015 3
Column Fixture (2) Nome do package e classe da fixture edu.ncsu.csc.columnclass atributo1 atributo2 metodo1? metodo2() 1 a true 3 2 b false 6 Nomes dos atributos e métodos Valores de dados e resultados Universidade Portucalense Engenharia de Software ES04 2014-2015 4
Código da ColumnFixture package edu.ncsu.csc; import fit.columnfixture; public class ColumnClass extends ColumnFixture { public int atributo1; public String atributo2; public boolean metodo1() { // o código entraria aqui return...; } public int metodo2() { // o código entraria aqui return...; } } public void execute() { } // o código entraria aqui Universidade Portucalense Engenharia de Software ES04 2014-2015 5
Exemplo de ColumnFixture (1) exemplo.futebol.calculapontos equipa jogos vitorias empates derrotas pontos() Aliados 20 18 2 0 56 Unidos 19 15 0 4 56 Amigos 19 9 6 4 33 Amadores 19 8 5 6 29 exemplo.futebol.calculapontos identifica a classe a ser usada neste teste; é uma classe derivada de ColumnFixture As colunas equipa, jogos, vitorias, empates e derrotas referem-se a atributos que têm que existir na classe CalculaPontos A coluna pontos() refere-se a um método que tem que existir na classe CalculaPontos Em cada teste, o valor de cada coluna é atribuído ao atributo correspondente, depois o método é invocado e o resultado comparado com o valor da tabela Universidade Portucalense Engenharia de Software ES04 2014-2015 6
Exemplo de ColumnFixture (2) exemplo.futebol.calculapontos equipa jogos vitorias empates derrotas pontos() Aliados 20 18 2 0 56 Amigos 19 15 0 4 Unidos 19 9 6 4 33 Amadores 19 8 5 6 29 56 expected 45 actual O resultado do teste é uma tabela HTML que assinala os valores obtidos, consoante são iguais ou diferentes dos esperados Universidade Portucalense Engenharia de Software ES04 2014-2015 7
RowFixture (1) Uma tabela HTML baseada numa RowFixture Aplica-se quando os valores de retorno dos métodos são coleções de objetos A primeira linha identifica a RowFixture a ser usada no teste; é uma classe derivada de RowFixture A segunda linha identifica os atributos ou métodos dos objetos, um em cada coluna Cada linha a partir da terceira identifica objetos que devem fazer parte da coleção retornada pela fixture, e o valor de cada atributo desse objeto; a ordem dos objetos não é importante O método public Object[] query() throws Exception da classe referida na primeira linha retorna a coleção cujo conteúdo é comparado com a tabela Universidade Portucalense Engenharia de Software ES04 2014-2015 8
RowFixture (2) Identifica a classe usada no teste Atributos dos objetos exemplo.minharowfixture args[0] Argumentos atributo1 atributo2 atributo3 método4() 1 a true 3 2 b false 6 Objetos retornados na coleção Universidade Portucalense Engenharia de Software ES04 2014-2015 9
Exemplo de RowFixture (1) exemplo.futebol.calculatabela equipa jogos vitorias empates derrotas pontos() Aliados 20 18 2 0 56 Unidos 19 15 0 4 45 Amigos 19 9 6 4 33 O método public Object[] query() throws Exception da classe CalculaTabela deve retornar um array de objectos, por exemplo do tipo EquipaTeste. Cada objeto do tipo EquipaTeste tem os atributos equipa, jogos, vitorias, empates e derrotas, e o método pontos() que retorna um valor inteiro. A coleção retornada por query() é comparada com a tabela. Universidade Portucalense Engenharia de Software ES04 2014-2015 10
Código da RowFixture package exemplo.futebol; import fit.rowfixture; public class CalculaTabela extends RowFixture {... public Object[] query() throws Exception {......... lista = campeonato.getclassificacoes(); listateste = lista.toarray(); // o retorno tem que ser um array return listateste; // array de objetos do tipo EquipaTeste } } // indica a classe dos objetos retornados pelo método query() public Class gettargetclass() { return EquipaTeste.class; } Universidade Portucalense Engenharia de Software ES04 2014-2015 11
Exemplo de RowFixture (2) exemplo.futebol.calculatabela equipa jogos vitorias empates derrotas pontos() Aliados 20 18 2 0 56 Unidos 19 15 0 4 45 Amigos 19 9 6 4 33 Amadores missing 19 8 5 6 29 Neste exemplo mostramos um caso em que a coleção retornada tem mais um objeto (o referente à equipa Amadores ) do que os que constavam da tabela de teste. A discrepância é assinalada. Qualquer discrepância entre os valores da tabela de teste e os valores dos objetos retornados pelo método query será assinalada. Universidade Portucalense Engenharia de Software ES04 2014-2015 12
Métodos reset e execute Quando se escreve uma classe que deriva RowFixture, podem ser reescritos (override) dois métodos: reset() É invocado antes do processamento de cada linha da tabela execute() É invocado imediatamente antes de ser processada a primeira célula que contém () ou?, em cada linha da tabela, ou após ser processada a última célula de cada linha da tabela, conforme o caso que surgir primeiro Podem ser usados para tratar cada linha como uma transação. reset() pode limpar as variáveis e preparar o estado do objeto para a próxima transação, e execute() pode fazer o processamento da transação Universidade Portucalense Engenharia de Software ES04 2014-2015 13
Action Fixture (1) Uma tabela HTML baseada numa ActionFixture Cada tabela representa uma sequência de passos usados para executar um caso de teste Cada linha da coluna representa um comando a ser executado; são executados por ordem, de cima para baixo A primeira coluna descreve um comando que é executado A classe ActionFixture tem quatro comandos possíveis; se estendermos esta classe podemos criar mais comandos start: nome da classe que é a fixture associada a este teste enter: um método com um argumento (simula uma entrada de dados, por exemplo um textfield) press: um método sem argumentos e sem retorno (simula um botão) check: um método sem parâmetros com retorno (testa um resultado, comparando o valor dado com o retornado pelo método) Sempre que é executado o comando check, termina um caso de teste Universidade Portucalense Engenharia de Software ES04 2014-2015 14
Action Fixture (2) Identifica que esta tabela descreve uma ActionFixture Fit.ActionFixture Start: chamada só uma vez; classe associada a esta Fixture start exemplo.minhaactionfixture enter metodo1 1 press metodo2 check metodo3 true Comandos Universidade Portucalense Engenharia de Software ES04 2014-2015 15
Código da ActionFixture package edu.ncsu.csc; import fit.actionfixture; public class ActionClass extends ActionFixture { public void metodo1(int num) { } // o código entraria aqui public void metodo2() { } // o código entraria aqui public boolean metodo3() { // o código entraria aqui return...; } } Universidade Portucalense Engenharia de Software ES04 2014-2015 16
Tipos de dados Tipos de dados convertidos automaticamente: String; inclui null e blank byte ou Byte short ou Short int ou Integer long ou Long float ou Float double ou Double char ou Character boolean ou Boolean Arrays true, yes, y, +, 1 são entendidos como true; o resto é entendido como false lista de valores separados por vírgula; os valores são convertidos em array Universidade Portucalense Engenharia de Software ES04 2014-2015 17
Expressões de comparação de valores Nas células para as quais se esperam valores numéricos podem ser escritas expressões de comparação O símbolo _ (underscore) representa o valor de retorno do método Podem ser usados operadores relacionais habituais _ < 32 _ >= 99 Podem usadas gamas de valores 38 <= _ < 55 Em expressões simples pode ser omitido o símbolo _ < 99 Universidade Portucalense Engenharia de Software ES04 2014-2015 18
Parâmetros Podem ser passados parâmetros nas células da tabela que ficam à direita do nome da fixture; no exemplo abaixo, 8. Podem ser passados mais parâmetros nas células seguintes No código, estes valores do tipo String são acedidos pelo array args: args[0], args[1], etc. No exemplo, args[0] vale 8 exemplo.minharowfixture 8 atributo1 atributo2 atributo3 atributo4 1 a true 3 2 b false 6 Universidade Portucalense Engenharia de Software ES04 2014-2015 19
Fitnesse Ferramenta de execução de testes baseados em FIT Funciona como um servidor web, com interface do tipo wiki Permite definir os testes de forma interativa Permite importar a definição dos testes a partir de tabelas definidas, por exemplo, em folhas de cálculo Fitnesse é o que é visível, mas por trás está FIT a executar os testes Fitnesse tem uma ferramenta alternativa opcional para a execução dos testes, SLIM. Suporta fixtures diferentes, algumas mais flexíveis do que as FIT As páginas são HTML, criadas automaticamente a partir de páginas de texto Universidade Portucalense Engenharia de Software ES04 2014-2015 20
Formatação de texto Criação de páginas Bold: três plicas '''Este texto é apresentado em negrito''' Itálico: duas plicas ''Este texto é apresentado em itálico'' Para centrar uma linha: é antecedida por!c Para criar uma linha de separação: quatro ou mais traços ---- Para escrever texto não formatado: incluí-lo entre!- e -! Exemplo:!- '''bold''' -! tem como efeito escrever '''bold''' Outro exemplo:!-<i>hello</i>-! tem como efeito hello Texto pré-formatado: {{{ texto pré-formatado }}} Universidade Portucalense Engenharia de Software ES04 2014-2015 21
Definição do Path a usar!path c:\directory Criação de páginas(2) Exemplo: todos os ficheiros jar de um diretório:!path /usr/javalib/*.jar Exemplo: todos os ficheiros jar de um diretório e subdiretórios: Listas!path /usr/javalib/**.jar [space]* Item one [space][space]* Sub item one Listas numeradas [space]1 Item one [space]1 Item two Os testes estão descritos em tabelas O texto escrito fora das tabelas é considerado comentário Universidade Portucalense Engenharia de Software ES05 2014-2015 22
Exemplo de página!contents -R2 -g -p -f -h!path D:\Particular\git\DespesasFIT\DespesasFIT\bin\ fit.actionfixture start fixtures.despesateste enter descricao Almoço enter colaborador Ze enter valor 15 Universidade Portucalense Engenharia de Software ES04 2014-2015 23
Fitnesse - arquitectura Universidade Portucalense Engenharia de Software ES04 2014-2015 24