# Probando tu app

> El framework de pruebas (TestCase), simulación de toques y comparación visual por screenshot.

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

# 11. Probando tu app

> **Lo que vas a aprender:** crear una red de seguridad con pruebas que se ejecutan en el runtime gráfico.
> **Prerrequisitos:** [Haciéndolo responsivo](/docs/learn/making-it-responsive).

## Ejemplo completo (copiar, pegar y ejecutar)
A diferencia de los otros capítulos, aquí el ejemplo autosuficiente es un `TestCase` completo (no una
`MainWindow`): abre la pantalla en `load()`, simula toques en `runTests()` y compara el screenshot con el
golden. `DeviceConfig.isTesting = true` hace la renderización determinista. Compila tal cual.
```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;                 // prerrequisito del golden (determinismo)
      new TarefasScreen().show();
   }

   @Override
   public void runTests() throws Exception
   {
      waitWindow(TarefasScreen.class);               // espera un frame estable
      type(0, TextField.class, "Comprar pão");       // escribe en el 1er TextField
      click("Adicionar");                            // hace clic en el botón por el texto
      shot();                                        // captura y compara con el golden
   }

   @Override
   protected void unload() { }
}

class TarefasScreen extends Window                   // la pantalla bajo prueba
{
   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 ejecutar la suite:
```java
new TestSuite().startTests(new TestCase[]{ new AdicionarTarefaTest() });
```
> Los fragmentos siguientes muestran **solo el núcleo** (lo que va dentro de `onShow()`). Para ejecutar, colócalos en el esqueleto `MainWindow` de arriba.

## Las pruebas se ejecutan en el runtime gráfico (no es JUnit)
Cada `TestCase` corre dentro del paint thread/pipeline GL; la aserción principal es la **comparación 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");   // escribe en el campo
      click("Adicionar");                         // hace clic en el botón
      shot();                                     // captura y compara con el golden
   }
   @Override protected void unload() { }
}
```
Ejecutar con una `TestSuite`:
```java
new TestSuite().startTests(new TestCase[]{ new AdicionarTarefaTest() });
```

## ⚠️ Determinismo: `DeviceConfig.isTesting`
La comparación píxel a píxel solo coincide si la renderización es determinista. Activa
`DeviceConfig.isTesting = true` (fija el cursor, elimina timestamps) — **sin esto, el golden nunca coincide**.
Usa `waitWindow(...)`/`waitAnimation()` antes de `shot()` para capturar un **frame estable**.

## Screenshot directo
```java
Image atual = Main.getScreenShot(true);   // captura el frame (opaco) para comparar con el baseline
```

## Construyes en este paso
Pruebas para **agregar/persistir** tarea y una **prueba visual** de una pantalla.

## Recapitulando
`TestCase` (`load`/`runTests`/`unload`) + `click`/`type`/`shot`; `DeviceConfig.isTesting` es
prerrequisito del golden; captura frames estables.

## Próximos pasos
→ [Publicando](/docs/learn/shipping)

## Ver también
- [Pruebas (best-practices)](/docs/best-practices/testes) · Fuente canónica: Capítulo 31 — Pruebas
