Flex: Teste de unidade em Actionscript
Postado em 05. abr, 2010 por David Paniz em Inovação, Web Design
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:
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.

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.

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.
[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.

E no Eclipse temos o resultado:
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:
[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:
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));
}
E agora ao executarmos os testes temos o seguinte resultado:
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, mock4as,
Flex Monkey e o Flash Selenium.
David Paniz
4 Respostas para “Flex: Teste de unidade em Actionscript”
Trackbacks/Pingbacks
-
-
abril 11, 2010
[...] Flex: Teste de unidade em Actionscript – David Paniz (Blog da Caelum); [...]

ASSINE NOSSO RSS




Michael Labriola
06. abr, 2010
Peço desculpa por utilizar um tradutor para este texto. Falo espanhol suficiente para entender o artigo, mas não Português. A versão do FlexUnit no Adobe Labs é mais velha. Nós estamos esperando Adobe irá actualizar em breve. Entretanto, as versões mais recentes podem ser encontradas em http://www.flexunit.org
Obrigado por escrever sobre FlexUnit.
Mike
Bruno
07. abr, 2010
parabéns pelo artigo David!
apenas gostaria de uma dica,como configurar o flex builder para rodar flexunit, lembrando que o meu aqui é flexbuilder 3, e não tem essa opção
abraço
David Paniz
09. abr, 2010
Bom dia Bruno,
Para criar os testes usando o Flex Builder 3 basta baixar o FlexUnit em http://github.com/flexunit/flexunit/downloads. Extrair e copiar os arquivos flexunit-4.0.0.swc e flexunit-uilistener-4.0.0.swc para o diretório libs do seu projeto. Escreva os testes criando classes comuns seguindo esse post e depois para executa-los basta criar e executar um arquivo como este (http://gist.github.com/361232). Para mais informações recomendo ler a documentação do projeto – http://docs.flexunit.org/.