Flex: Teste de unidade em Actionscript

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.

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.

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.

6 Comentários

  1. Michael Labriola 06/04/2010 at 12:37 #

    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

  2. Bruno 07/04/2010 at 21:25 #

    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

  3. David Paniz 09/04/2010 at 12:20 #

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

  4. erickson 11/10/2017 at 14:24 #

    Eu uso action script 3 para games.
    Atualmente estou fazendo em adobe animate cc.posso usar Flex builder?
    Tem algum livro sobre Flex?

  5. David Paniz 16/10/2017 at 19:22 #

    Olá Erickson,

    O Flex builder foi descontinuado, atualmente a Adobe disponibiliza a Flash Builder https://www.adobe.com/in/products/flash-builder.html. Apesar disso, o código foi para a Apache e você pode usar o compilador do Flex até por linha de comando, independente de qual IDE esteja usando. Você pode ver mais em http://flex.apache.org

Deixe uma resposta