Widget test en Flutter: ejercicio resuelto para testear UI

  2 minutos

Si te interesa testing en Flutter, este ejercicio te enseña a validar una interacción de UI con flutter_test.

Testea un contador para comprobar que al pulsar el botón aumenta de 0 a 1.

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

class CounterWidget extends StatefulWidget {
  const CounterWidget({super.key});

  @override
  State<CounterWidget> createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            Text('$count'),
            ElevatedButton(onPressed: () => setState(() => count += 1), child: const Text('Sumar')),
          ],
        ),
      ),
    );
  }
}

void main() {
  testWidgets('incrementa contador al pulsar', (tester) async {
    await tester.pumpWidget(const CounterWidget());

    expect(find.text('0'), findsOneWidget);
    await tester.tap(find.text('Sumar'));
    await tester.pump();
    expect(find.text('1'), findsOneWidget);
  });
}

El test pasa y asegura que la interacción principal sigue funcionando.

  • No usar pump después de interacciones.
  • Escribir tests demasiado acoplados al layout.
  • No cubrir casos básicos de error o estado inicial.

Los widget tests reducen regresiones y ahorran tiempo en refactors de interfaz.

El unit test valida lógica aislada; el widget test valida comportamiento de componentes visuales.

No siempre. Para flujos completos también conviene test de integración.

Desde el inicio, al menos en casos críticos de UI y lógica de negocio.