Estou trabalhando em um projeto em que a interface foi construída com Flex. Estou me adaptando novamente a IDE e não consegui encontrar nenhuma ferramenta de integração entre o VIM e o Eclipse que funcionasse no mac.

O ciclo de desenvolvimento

Testar um sistema em Flex, tem sido uma satisfação no ciclo de desenvolvimento orientado a testes. Cada pequena alteração no Flex, envolve uma série de tarefas como:

  • abrir o browser
  • logar no sistema
  • navegar até chegar no ponto desejado
  • preencher os campos
  • verificar a validade da execução do serviço
  • então o teste passou ou falhou
  • implementação
  • se o teste passou posso escrever um novo teste
  • reabrir o browser e reiniciar este ciclo

Existem basicamente dois passos acima que não são repetitivos, implementação e adicionar novas funcionalidades escrevendo novos testes. Os outros passos são apenas consequências destes dois. Sendo este um processo de vários passos, como desenvolvedor quero automatizar estes passos repetitivos.

Abrir o browser

Para abrir o browser, e testar o aplicativo flex, estou usando Watir], com o browser Safari. Através de uma simples instância do browser é possível navegar por páginas e acessar os elementos do contexto.

  @browser = Watir::Safari.new
  @browser.goto("http://localhost:3000/")

Em conjunto com a biblioteca FunFx é possível compilar uma versão do aplicativo flex, com algumas ferramentas que permitem automação de tarefas e manipulação do aplicativo. Neste projeto estou usando as seguintes biblitecas:

  • FunFXAdapter.swc
  • automation.swc
  • automation_agent.swc
  • automation_dmv.swc
  • funfx-0.2.2.swc

Com estas bibliotecas e a gem FunFx, é possível resgatar o objeto principal do aplicativo flex, que está na página aberta anteriormente:

  @flex = @browser.flex_app("flashContent", "NomeDoSWF")  

Após isso o objeto flex está disponível e pode manipular elementos por vários tipos de seletores.

  @flex.text_field(:id => "username").input("jonatas")
  @flex.tab_navigator(:automationName => "Administração").change("Usuários")
  @flex.button(:id => "login").click

Com estes e outros métodos, é possível manipular e testar o funcionamento do aplicativo flex. AutomationName é um nome deduzido pela própria biblioteca e geralmente é representado pelo próprio label do componente.

Através de uma ferramenta de gravação de tarefas, é possível verificar a melhor forma de maniupular os componentes de cada tela. A ferramenta grava os passos executados e transforma em código ruby, semelhante ao exemplo abordado anteriormente, apenas mais sujo e preciso. Esta sujeira, na verdade se trata de um código denso, pois ao invés de usar apenas um seletor, o gravador usa vários seletores ao mesmo tempo. O exemplo a seguir, trata-se da gravação de apenas um clique em um botão:

@flex.panel({:id => 'users', 
        :automationName => 'Usuarios', 
        :automationIndex => 'index:4', 
        :automationValue => 'Usuarios'}
        ).button({
           :id => 'newUserButton',
           :automationName => 'Novo', 
           :automationIndex => 'index:5', 
           :automationValue => 'Novo'}).click('0')

Também é interessante olhar este exemplo, para entender as várias formas de se atingir o mesmo elemento, ou garantir que será aquele. Agora basta escolher qual é a melhor forma de acessar o elemento, retirando os seletores que apenas garantem que será aquele elemento.

@flex.panel(:id => 'users').button(:id => 'newUserButton').click('0')

Para usufruir desta bela biblioteca, estou usando Cucumber para escrever as estórias e implementar os passos.

Para não sofrer em reiniciar o ciclo todas as vezes, estou usando Autotest para reiniciar o ciclo a cada alteração efetuada. Uma prática que gostei, foi de manter uma tag @focus apenas na estória que estou executando, então na configuração do cucumber adicionei o seguinte:

autotest-all: --format pretty --tags @focus

Usando estas ferramentas, tenho certeza que estou evitando muitas horas de navegação e teste manual. Além de tudo, garanto que o aplicativo está funcionando por inteiro, pois quando um teste quebrar, posso fácilmente identificar o erro e manter o sistema consistente.

Olhando para cada pequena funcionalidade, posso desenvolver apenas pequenos fragmentos, e fazer os testes passar.

Sem medo, cada passo acontece no seu tempo, e não gasto tempo navegando “pessoalmente” no sistema. Também evito aborrecimentos com grandes alterações. Uma alteração deve ser iniciada sempre com a escrita de um teste, pois quando você terminar a alteração, ela já vai estar pronta e testada.

Cada dia que passa, tenho certeza que o desenvolvimento orientado a testes, juntamente com os outros princípios do Extremme Programming trazem muitos benefícios para:

desenvolvedor

  • sempre evolui suas técnicas
  • melhora a qualidade do produto
  • têm certeza da tarefa que está implementando
  • mantêm o código auto documentado
  • mantém o foco em um pequeno passo a cumprir
  • satisfação em ver as funcionalidades implementadas

produto

  • é mais preciso
  • resolve exatamente o que o teste (a estória) propõe

equipe

  • entende fácilmente a funcionalidade
  • adapta-se ao código
  • levanta cenários de falhas ou estórias ainda não contadas

proprietário do produto

  • têm um documento formal em mãos que cumpre exatamente o que a estória conta ou seja, o que o aplicativo faz
  • desenvolve uma habilidade e satisfação pelo protocolo utilizado
  • respeita a estória e sabe que está “assinando um cheque” ao concordar com ela

Conclusões

Cada passo que tenho andado tenho certeza que tem sido para frente. Aparentemente, executar um processo automatizado torna o desenvolvimento mais lento, mas no final das contas, é mais seguro e traz uma série de boas consequências para todos aspectos do negócio.

Jônatas Davi Paganini

Jônatas Davi Paganini

Senior developer and technical consultant with 20+ years of experience specializing in PostgreSQL, TimescaleDB, and distributed systems. Expert in database optimization, microservices architecture, and team enablement. Passionate about sharing knowledge through writing, speaking, and mentoring.