1. Flutter支持哪几种类型的测试?如何编写一个Widget测试?
-
单元测试(
test包) -
Widget 测试(
flutter_test包) -
集成测试(
flutter_driver或integration_test)
Widget 测试示例:
testWidgets('MyWidget shows title', (WidgetTester tester) async {
await tester.pumpWidget(MyWidget(title: 'Hello'));
expect(find.text('Hello'), findsOneWidget);
});
⚠️ 注意事项:
使用 pump 和 pumpAndSettle 控制帧。
避免在测试里依赖真实网络。
2. flutter run --release 和 --debug 在性能上有什么不同?
-
--debug:启用断言、服务扩展、JIT 编译、快速热重载;性能较慢,用于开发。 -
--release:禁用断言和调试功能,AOT 编译,树摇优化,性能最佳,用于发布。 - 还有
--profile,介于两者之间,保留部分调试能力但性能接近 release。
⚠️ 注意事项:
- 性能问题只能在
--release或--profile模式下真实复现。
3. 你常用的Flutter调试手段有哪些?
-
print/debugPrint(避免 Android 日志截断)。 - 断点调试(VS Code / Android Studio)。
- DevTools:性能、内存、布局检查器、网络。
- Flutter Inspector 查看 Widget 树。
-
debugPaintSizeEnabled显示布局边界。
⚠️ 注意事项:
- 避免在生产代码中遗留
4. 如何在 Widget 测试中模拟网络请求?
答案: 使用 HttpOverrides 全局拦截,或者 Mock http.Client 并注入到服务类中。也可使用 mockito 创建 mock client。
⚠️ 注意事项: 注意测试后恢复
HttpOverrides或重置 mock。
5. flutter test 默认执行哪些测试文件?
答案: 查找 test/ 目录下所有 _test.dart 结尾的文件。可以使用 --name 或 --plain-name 运行特定测试用例。
⚠️ 注意事项: 集成测试通常放在
integration_test/目录。
6. 什么是 testWidgets 中的 WidgetTester 的 pump 和 pumpAndSettle?
答案: pump 推动一帧(或指定时间)。pumpAndSettle 反复调用 pump 直到所有动画、定时器完成(或超时),适用于等待过渡动画完成。
⚠️ 注意事项: 无限动画会导致
pumpAndSettle永远卡住,需要小心。
7. 如何测试 showDialog 弹出的对话框?
答案: 在 testWidgets 中调用 pump 后,使用 find.byType(AlertDialog) 查找,然后点击按钮可使用 tester.tap,再 pump。
⚠️ 注意事项: 对话框是 overlay 的一部分,确保
MaterialApp存在并提供Navigator。
8. 什么是 golden test(黄金测试)?用途?
答案: 将 Widget 渲染为图片并与之前存储的“黄金”图片对比,用于检测 UI 回归。在 flutter_test 中使用 matchesGoldenFile 方法。
⚠️ 注意事项: 不同平台、字体、分辨率可能导致差异,需维护黄金文件。
9. 如何在调试时查看布局边界?
答案: 在 MaterialApp 中设置 debugShowMaterialGrid: true 或使用 debugPaintSizeEnabled = true(需要在 main 中设置)。DevTools 的 “Layout Explorer” 也很有用。
⚠️ 注意事项: 仅用于 debug 模式,发布时自动禁用。
10. 如何捕获未处理的 Flutter 异常?
答案: 使用 FlutterError.onError 处理框架层异常。对于 Dart 层异步异常,可以设置 PlatformDispatcher.instance.onError 或使用 runZonedGuarded。
⚠️ 注意事项: 捕获后应上报到崩溃分析平台,避免永久吞噬异常。
11. 如何测试 Stream 的发出值?
答案: 使用 expectLater(stream, emitsInOrder([...])) 来自 test 包。或者手动订阅 Stream,在 onData 中存入列表,最后断言。
⚠️ 注意事项: 确保测试完成时取消订阅,避免资源泄漏。
12. flutter drive 是什么?和 flutter test 区别?
答案: flutter drive 是运行集成测试的命令,它会在真实设备或模拟器上运行测试,并可与应用交互。flutter test 通常在本地 VM/头端运行,不涉及真实 UI 渲染。
⚠️ 注意事项:
flutter drive较慢,适合关键路径测试。
13. 如何使用 DevTools 的 CPU Profiler 定位卡顿?
答案: 在应用运行时记录 CPU 采样,查看耗时方法。重点关注 build、layout、paint 等方法的累计时间,以及是否存在同步 I/O 或密集计算。
⚠️ 注意事项: 采样可能在 Release 模式禁用,可以使用
--profile模式运行。