Flex: Teste de unidade em Actionscript

Flex: Teste de unidade em Actionscript
david.paniz
david.paniz

Compartilhe

A comunidade Flex brasileira está cada vez maior, hoje temos 3 grandes grupos: Flex-Brasil, Flexdev e o fórum RIA - Flex, JavaFX e outros no GUJ. Embora essas comunidades estejam cada vez maiores e mais ativas, ainda é raro encontrar discussões sobre testes. Justamente por ser um assunto não muito discutido, e dada a extrema importância de testes em todos os nossos tiers, vale fazer uma introdução ao FlexUnit.

O Actionscript tem uma grande influência da linguagem java, e no seu framework de testes não é diferente. O FlexUnit tem muitas características vindas do JUnit na sua concepção.

Assim como no JUnit, no FlexUnit (versão 4) declaramos nossos testes através de metadados (equivalente as anotações do java). Temos o Before e o After, que serão executados antes e depois de todos os métodos de teste. Os metadados BeforeClass e AfterClass que serão executados uma única vez para todos os testes da classe, e finalmente o metadado Test que define que aquele método é um teste.

Lembrando que a utilização de metadados em Actionscript é um pouco diferente do java, sendo [Test] em vez de @Test, como vemos no trecho de código abaixo:

 ```Test
 public function doisMaisDoisDeveSerIgualAQuatro():void { Assert.assertEquals(4, 2 + 2); } 

O FlexUnit, assim como o Cairgorm, o LiveCyle e algumas outras ferramentas para Flex, é um projeto opensource mantido pela Adobe e pode ser encontrado no Adobe Labs. Se você já está usando o Flash Builder 4, o FlexUnit já vem instalado e configurado.

Para exemplificar melhor imagine que puxamos de um serviço uma lista de Notas de uma determinada turma e queremos gerar um gráfico mostrando qual é a menor nota, a maior nota e a média de notas da turma e para agrupar esses dados criamos a classe ResultadoDeTurma:

 public class Nota { public var nota:Number; public var nome:String; } 
 public class ResultadoDeTurma { public var menorNota:Number; public var maiorNota:Number; public var media:Number; } 

A classe responsável pelo agrupamento de dados é a AgrupadorDeTurma onde temos o seguinte código: ```actionscript3 public class AgrupadorDeTurma { public function agrupa(notas:ArrayCollection):ResultadoDeTurma { var menor:Number = Number.MAX_VALUE; var maior:Number = 0; var total:Number = 0; for each(var nota:Nota in notas) { if (nota.nota < menor){ menor = nota.nota; } else { if(nota.nota > maior){ maior = nota.nota; } } total += nota.nota; } return new ResultadoDeTurma(menor, maior, (total/notas.length)); } }


Agora vamos criar o nosso teste.

![Criando um teste](assets/testando-seu-codigo-flex-teste-de-unidade-em-actionscript/Screen-shot-2010-04-05-at-4.00.30-PM-300x152.png "Criando um teste")

Nesse wizard criamos a classe `AgrupadorDeTurmaTeste`. O Flash Builder criará 2 arquivos, a classe de teste e um outro na raiz do projeto chamado `FlexUnitCompilerApplication.mxml`. Devemos executar esse arquivo para que ele crie um executor de testes como vemos na imagem abaixo.

[![](assets/testando-seu-codigo-flex-teste-de-unidade-em-actionscript/Screen-shot-2010-04-05-at-4.04.10-PM-300x227.png "FlexUnit Compiler")](https://blog.caelum.com.br/wp-content/uploads/2010/04/Screen-shot-2010-04-05-at-4.04.10-PM.png)

Ao término desse passo teremos o arquivo `FlexUnitApplication.mxml` que é usado para executar nossos testes. Agora que toda nossa "infra" está pronta, vamos escrever nosso primeiro método de teste. Para isso basta adicionar o método abaixo no arquivo `AgrupadorDeTurmaTeste.as`. ```actionscript3
 ```Test
 public function testandoComArrayComTresElementos():void { var notas:ArrayCollection = new ArrayCollection(``` new Nota(9, "David Paniz"), new Nota(10, "Paulo Silveira"), new Nota(8, "Guilherme Silveira") 
); var resultado:ResultadoDeTurma = new AgrupadorDeTurma().agrupa(notas); assertEquals(10, resultado.maiorNota); assertEquals(8, resultado.menorNota); assertEquals(9, resultado.media); } 
``` Para executar os testes basta rodar o arquivo `FlexUnitApplication`.

[![](assets/testando-seu-codigo-flex-teste-de-unidade-em-actionscript/Screen-shot-2010-04-05-at-4.20.57-PM-300x187.png "Execução dos testes no browser")](https://blog.caelum.com.br/wp-content/uploads/2010/04/Screen-shot-2010-04-05-at-4.20.57-PM.png)

E no Eclipse temos o resultado:

[![](assets/testando-seu-codigo-flex-teste-de-unidade-em-actionscript/Screen-shot-2010-04-05-at-4.21.24-PM-300x44.png "Execução no eclipse")](https://blog.caelum.com.br/wp-content/uploads/2010/04/Screen-shot-2010-04-05-at-4.21.24-PM.png)

Quando o teste passa, o código está correto. Mas será que esse código realmente está correto? Será que só este teste basta para eu ter toda essa garantia? Vejamos, vou escrever outro teste para o mesmo método:

```actionscript3
 ```Test
 public function testandoComArrayComUmElementos():void { var notas:ArrayCollection = new ArrayCollection(``` new Nota(8, "Guilherme Silveira") 
); var resultado:ResultadoDeTurma = new AgrupadorDeTurma().agrupa(notas); assertEquals(8, resultado.maiorNota); assertEquals(8, resultado.menorNota); assertEquals(8, resultado.media); } 

Ao executarmos nossos testes novamente temos o seguinte resultado:

Acabamos de encontrar uma falha no nosso teste. Dentro da iteração de notas, não havíamos previsto que e mesma nota poderia ser a maior e a menor ao mesmo tempo. Para solucionar precisamos remover o else do if: ```actionscript3 public function agrupa(notas:ArrayCollection):ResultadoDeTurma { var menor:Number = Number.MAX_VALUE; var maior:Number = 0; var total:Number = 0; for each(var nota:Nota in notas) { if (nota.nota < menor){ menor = nota.nota; } if (nota.nota > maior){ maior = nota.nota; } total += nota.nota; } return new ResultadoDeTurma(menor, maior, (total/notas.length)); }



[![](assets/testando-seu-codigo-flex-teste-de-unidade-em-actionscript/Screen-shot-2010-04-05-at-6.10.37-PM-300x63.png "Testes corrigidos")](https://blog.caelum.com.br/wp-content/uploads/2010/04/Screen-shot-2010-04-05-at-6.10.37-PM.png)

Na verdade ainda temos outros possíveis problemas nesse código que poderiam ser testados, como por exemplo receber um array vazio como parâmetro. Tanto esse quanto o erro anterior teriam sido mais facilmente detectados caso usássemos TDD, criando nossos testes antes mesmo do código.

Outras ferramentas para conhecer sobre testes em Flex são o [Flexcover](http://code.google.com/p/flexcover/), [mock4as](http://code.google.com/p/mock4as/), [Flex Monkey](http://www.gorillalogic.com/flexmonkey) e o [Flash Selenium](http://code.google.com/p/flash-selenium/).

Veja outros artigos sobre Front-end