testWidgets
- Flutter course
- Advanced
- Lesson 62/69
- 4 min
Write widget render tests with testWidgets.
testWidgets
testWidgets registers a widget test. Inside it, you use the WidgetTester to render a widget by calling pumpWidget, then verify with expect. The test body is async because pumpWidget returns a Future.
testWidgets('shows button', (tester) async {
await tester.pumpWidget(MaterialApp(home: MyButton()));
expect(find.byType(ElevatedButton), findsOneWidget);
});expect and Matcher
expect compares an actual value against an expected value. The first parameter is the actual value (usually a Finder), the second is a Matcher. findsOneWidget verifies exactly one widget, findsNothing verifies none, and findsNWidgets(3) verifies exactly N.
Practice Write a button test
In main, write a testWidgets test named 'buton gosterilir'. Render MaterialApp(home: ElevatedButton(onPressed: () {}, child: Text('Tikla'))) with pumpWidget. Verify with find.byType(ElevatedButton) and findsOneWidget. Finally print 'test tanimlandi'.
Starter code
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
void main() {
// 'buton gosterilir' adlı testWidgets testi yaz
// pumpWidget ile MaterialApp içinde ElevatedButton render et
// find.byType ile ElevatedButton bul ve findsOneWidget ile doğrula
// son olarak 'test tanimlandi' yazdir
}Sample solution
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
void main() {
testWidgets('buton gosterilir', (tester) async {
await tester.pumpWidget(
MaterialApp(
home: ElevatedButton(
onPressed: () {},
child: const Text('Tikla'),
),
),
);
expect(find.byType(ElevatedButton), findsOneWidget);
});
print('test tanimlandi');
}Expected output
test tanimlandi
Questions and answers
Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.
1 Why is await used before the pumpWidget call?
- Because it returns void
- Because it returns Widget
- Because it returns int
- Because it returns a Future and we must wait Correct answer
Explanation: pumpWidget returns a Future; await is used so the render completes before continuing.
2 pumpWidget call
await tester.____(MaterialApp(home: MyButton()));
await tester.pumpWidget(MaterialApp(home: MyButton()));
Explanation: WidgetTester.pumpWidget renders the given widget in the test environment; pump advances a single frame.
3 testWidgets matches
| Term | Meaning |
|---|---|
testWidgets |
Registers a widget test |
WidgetTester |
Test tool |
pumpWidget |
Renders a widget |
expect |
Compares |