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 esqueletoMainWindowacima.
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
Veja também
- Testes (best-practices) · Fonte canônica: Capítulo 31 — Testes