Skip to main content

Introdução em Testes | Flutter

  • Introdução em Testes | Flutter

1. Testes Unitários

Para lógica isolada (funções, classes), sem dependência de UI/Flutter. Conforme a documentação oficial: “Unit tests … verificam a correção de uma unidade de lógica sob várias condições”. ([docs.flutter.dev][1])

Principais métodos/utilitários

  • test() — função padrão para definir um caso de teste. ([docs.flutter.dev][2])
  • group() — agrupa vários testes logicamente. ([docs.flutter.dev][2])
  • setUp() / setUpAll() — executam lógica antes de cada teste ou antes de todos os testes de um grupo. (Parte do pacote package:test usado internamente por flutter_test) ([api.flutter.dev][3])
  • tearDown() / tearDownAll() — executam depois de cada ou todos os testes de um grupo. Usado para limpeza.
  • expect(actual, matcher) — asserção: verifica que actual corresponde ao matcher. (Matcher pode ser equals(...), isTrue, isNull, etc)
  • Mocks / Fakes — para isolar dependências externas (APIs, banco, etc). Embora não um “método” direto, é prática altamente usada. ([docs.flutter.dev][4])
  • Evitar dependência de UI/Flutter ou ambiente gráfico. Como “Unit tests … não renderizam para tela, não recebem ações de usuário externas”. ([docs.flutter.dev][1])

Exemplos rápidos

import 'package:test/test.dart';

class MyClass {
int increment(int x) => x + 1;
}

void main() {
group('MyClass', () {
MyClass myClass;
setUp(() {
myClass = MyClass();
});
test('increment returns correct value', () {
expect(myClass.increment(0), equals(1));
});
});
}

Notas de uso

  • Arquivos de teste devem estar dentro de test/ e terminarem com _test.dart. ([docs.flutter.dev][2])
  • DevDependencies em pubspec.yaml: flutter_test (inclui test) ou test se for puro Dart. ([Healthcare Solutions | Mindbowser][5])
  • Testes unitários são os mais rápidos, e devem compor a “base” da pirâmide de testes. ([kodeco.com][6])

2. Testes de Widget

Para verificar widgets (UI) isolados: ver se o widget renderiza corretamente, responde a interações, muda com estado, etc. Conforme a documentação: “Widget test … objetivo é verificar que o UI do widget pareça e interaja conforme o esperado.” ([docs.flutter.dev][1])

Principais métodos/utilitários

  • testWidgets(String description, WidgetTesterCallback callback) — define um teste de widget; dentro do callback você recebe um WidgetTester. ([docs.flutter.dev][7])
  • WidgetTester — classe que permite construir e interagir com widgets no ambiente de teste. Ex: pumpWidget(), pump(), enterText(), tap(), drag(). ([api.flutter.dev][8])
  • pumpWidget(Widget widget) — monta o widget no ambiente de teste (simula runApp). ([api.flutter.dev][8])
  • pump() ou pumpAndSettle() — avança o tempo do “fake async” para permitir animações, rebuilds, etc. pumpAndSettle() espera até não haver mais frames em animação. ([docs.flutter.dev][9])
  • Finder — utilitários para localizar widgets na árvore: find.text(), find.byType(), find.byIcon(), etc. ([Google Codelabs][10])
  • Matcher / expect() — para fazer asserções, por exemplo expect(find.text('Hello'), findsOneWidget). ([docs.flutter.dev][7])
  • Interações: tap(Finder finder), enterText(Finder finder, String text), drag(Finder finder, Offset offset), longPress(Finder finder), etc. ([api.flutter.dev][8])

Exemplos rápidos

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

void main() {
testWidgets('MyWidget displays title and message', (WidgetTester tester) async {
await tester.pumpWidget(const MyWidget(title: 'Olá', message: 'Mensagem'));

expect(find.text('Olá'), findsOneWidget);
expect(find.text('Mensagem'), findsOneWidget);
});
}

Outro exemplo com interação:

testWidgets('Incrementa o contador quando pressiona o botão +', (WidgetTester tester) async {
await tester.pumpWidget(const MyApp());
expect(find.text('0'), findsOneWidget);
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('1'), findsOneWidget);
});

Notas de uso

  • Widget tests rodam “quase” como a aplicação, mas em ambiente controlado (sem dispositivo real). ([docs.flutter.dev][1])
  • Ideal para testar comportamento de UI rápido, validações visuais, interações isoladas.
  • Use mocks/fakes para dependências externas se for necessário, para manter o teste leve.
  • Evite depender de estados externos ou renderizações que demorem muito — se for fluxo completo, considere teste de integração.

3. Referência rápida das interfaces (API) importantes

Do pacote flutter_test (assim como package:test)

  • testWidgets(...)

  • WidgetTester com métodos:

    • pumpWidget()
    • pump()
    • pumpAndSettle()
    • tap()
    • longPress()
    • enterText()
    • drag()
    • fling() etc ([api.flutter.dev][8])
  • find (Finders) com métodos:

    • find.text(String text)
    • find.byType(Type type)
    • find.byIcon(IconData icon) ([Google Codelabs][10])
  • expect() + matchers:

    • findsOneWidget, findsNothing, findsWidgets etc
  • setUp(), tearDown(), group() (herdados de package:test) ([docs.flutter.dev][2])