
在Flutter中,单元测试通过test包实现,需在pubspec.yaml的dev_dependencies下声明:
dev_dependencies:
test:测试文件通常位于test目录,与应用的lib目录分离。例如,测试一个计数器类Counter:
class Counter {
int count = 0;
void increase() => count++;
void decrease() => count--;
}测试用例包含定义、执行和验证三部分,使用expect断言结果:
import 'package:test/test.dart';
import 'package:flutter_app/main.dart';
void main() {
test('Increase counter to 1', () {
final counter = Counter();
counter.increase();
expect(counter.count, 1); // 验证结果
});
}使用group组织多个关联测试用例:
group('Counter', () {
test('Increase to 1', () {
final counter = Counter();
counter.increase();
expect(counter.count, 1);
});
test('Decrease to -1', () {
final counter = Counter();
counter.decrease();
expect(counter.count, -1);
});
});对于依赖外部服务(如HTTP请求)的测试,使用mockito模拟:
dev_dependencies:
mockito:定义模拟类并注入返回数据:
import 'package:mockito/mockito.dart';
import 'package:http/http.dart' as http;
class MockClient extends Mock implements http.Client {}
void main() {
test('Fetch Todo successfully', () async {
final client = MockClient();
when(client.get('https://xxx.com/todos/1'))
.thenAnswer((_) async => http.Response('{"title": "test"}', 200));
final todo = await fetchTodo(client);
expect(todo.title, 'test');
});
test('Fetch Todo with error', () {
final client = MockClient();
when(client.get('https://xxx.com/todos/1'))
.thenAnswer((_) async => http.Response('', 403));
expect(fetchTodo(client), throwsException);
});
}Flutter的UI测试使用flutter_test包,需在pubspec.yaml中添加:
dev_dependencies:
flutter_test:
sdk: flutter编写Widget测试用例:
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_app/main.dart';
void main() {
testWidgets('Counter increments', (WidgetTester tester) async {
await tester.pumpWidget(MyApp());
expect(find.text('0'), findsOneWidget);
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('1'), findsOneWidget);
});
}生成测试覆盖率报告:
flutter test --coveragelcov生成可视化报告(需安装lcov):genhtml coverage/lcov.info -o coverage/html
open coverage/html/index.html'Counter starts at 0')。通过结合单元测试和UI测试,Flutter应用可以实现从逻辑到界面的全面验证,显著提升代码质量和迭代效率。