# Testando seu app

> O framework de testes (TestCase), simulação de toques e comparação visual por screenshot.

Source: https://crossfly.dev/pt/docs/learn/testing-your-app — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# 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](/docs/learn/making-it-responsive).

## 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á.
```java
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:
```java
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*).
```java
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`:
```java
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
```java
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](/docs/learn/shipping)

## Veja também
- [Testes (best-practices)](/docs/best-practices/testes) · Fonte canônica: Capítulo 31 — Testes
