12. 测试与调试

1. Flutter支持哪几种类型的测试?如何编写一个Widget测试?

  • 单元测试test 包)
  • Widget 测试flutter_test 包)
  • 集成测试flutter_driverintegration_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 显示布局边界。

⚠️ 注意事项

  • 避免在生产代码中遗留 print,可使用日志工具统一控制开关。

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 采样,查看耗时方法。重点关注 buildlayoutpaint 等方法的累计时间,以及是否存在同步 I/O 或密集计算。

⚠️ 注意事项: 采样可能在 Release 模式禁用,可以使用 --profile 模式运行。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容