Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

11. Testando seu app

O que você vai aprender: criar uma rede de segurança com testes que rodam no runtime gráfico. Pré-requisitos: Deixando responsivo.

Exemplo completo (copiar, colar e rodar)

Diferente dos outros capítulos, aqui o exemplo autossuficiente é um TestCase completo (não uma MainWindow): abre a tela em load(), simula toques em runTests() e compara o screenshot com o golden. DeviceConfig.isTesting = true torna a renderização determinística. Compila como está.

package com.exemplo;

import dev.crossfly.test.*;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;

public class AdicionarTarefaTest extends TestCase
{
   @Override
   protected void load() throws Exception
   {
      DeviceConfig.isTesting = true;                 // pré-requisito do golden (determinismo)
      new TarefasScreen().show();
   }

   @Override
   public void runTests() throws Exception
   {
      waitWindow(TarefasScreen.class);               // espera um frame estável
      type(0, TextField.class, "Comprar pão");       // digita no 1º TextField
      click("Adicionar");                            // clica no botão pelo texto
      shot();                                        // captura e compara com o golden
   }

   @Override
   protected void unload() { }
}

class TarefasScreen extends Window                   // a tela sob teste
{
   private final TextField campo = new TextField().caption("Nova tarefa");
   private final Component listaBox = new Component();

   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());
      add(LAY_AUTO, campo);

      Button add = new Button("Adicionar");
      add.onAction(c -> {
         String t = campo.getText().trim();
         if (!t.isEmpty()) { listaBox.add(LAY_AUTO, new Label(t)); campo.clearText(); listaBox.setValidLayout(false); repaint(); }
      });
      add(LAY_AUTO, add);

      listaBox.setLayout(new VerticalLayout());
      add(LAY_FILL, listaBox);
   }
}

Para rodar a suíte:

new TestSuite().startTests(new TestCase[]{ new AdicionarTarefaTest() });

Os trechos abaixo mostram só o miolo (o que vai dentro de onShow()). Para rodar, coloque-os no esqueleto MainWindow acima.

Testes rodam no runtime gráfico (não é JUnit)

Cada TestCase roda dentro da paint thread/pipeline GL; a asserção principal é a comparação visual de screenshots (golden images).

public class AdicionarTarefaTest extends TestCase {
   @Override protected void load() throws Exception { new TarefasScreen().show(); }
   @Override public void runTests() throws Exception {
      waitWindow(TarefasScreen.class);
      type(0, TextField.class, "Comprar pão");   // digita no campo
      click("Adicionar");                         // clica no botão
      shot();                                     // captura e compara com o golden
   }
   @Override protected void unload() { }
}

Rodar com uma TestSuite:

new TestSuite().startTests(new TestCase[]{ new AdicionarTarefaTest() });

⚠️ Determinismo: DeviceConfig.isTesting

A comparação pixel-a-pixel só casa se a renderização for determinística. Ligue DeviceConfig.isTesting = true (fixa cursor, remove timestamps) — sem isso, o golden nunca bate. Use waitWindow(...)/waitAnimation() antes de shot() para capturar um frame estável.

Screenshot direto

Image atual = Main.getScreenShot(true);   // captura o frame (opaco) para comparar com o baseline

Constrói neste passo

Testes para adicionar/persistir tarefa e um teste visual de uma tela.

Recapitulando

TestCase (load/runTests/unload) + click/type/shot; DeviceConfig.isTesting é pré-requisito do golden; capture frames estáveis.

Próximos passos

→ Publicando

Veja também

Esta página foi útil?