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 pacotepackage:testusado internamente porflutter_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 queactualcorresponde aomatcher. (Matcher pode serequals(...),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(incluitest) outestse 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 umWidgetTester. ([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 (simularunApp). ([api.flutter.dev][8])pump()oupumpAndSettle()— 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 exemploexpect(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(...) -
WidgetTestercom 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,findsWidgetsetc
-
setUp(),tearDown(),group()(herdados depackage:test) ([docs.flutter.dev][2])