外观
测试、性能与发布
用测试覆盖实际行为
| 层次 | 适合验证 | 笔记应用示例 |
|---|---|---|
| 单元测试 | 纯逻辑和状态转换 | 搜索过滤、JSON 解析、Repository 错误处理 |
| Widget 测试 | 渲染与局部交互 | 空状态、表单提示、点击重试 |
| 集成测试 | 跨页面与平台主流程 | 编辑保存、重启恢复偏好、插件调用 |
测试分层与工具见 官方测试概览。优先验证用户可见行为;网络和平台依赖通过可替换接口隔离,减少测试对外部服务的依赖。
如果练习项目使用了 搜索页面,可将以下测试保存为 test/search_notes_test.dart。示例假定页面在 lib/main.dart 且项目名为 notes_app,实际名称不同需调整 import。
dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:notes_app/main.dart';
void main() {
testWidgets('搜索无结果后清空,恢复列表', (tester) async {
await tester.pumpWidget(
const MaterialApp(home: SearchNotesPage()),
);
await tester.enterText(find.byType(TextField), '不存在的标题');
await tester.pump();
expect(find.text('没有匹配的笔记'), findsOneWidget);
await tester.enterText(find.byType(TextField), '');
await tester.pump();
expect(find.text('Flutter 布局'), findsOneWidget);
expect(find.text('没有匹配的笔记'), findsNothing);
});
}在 Flutter 应用根目录执行以下命令;本知识库本身是 VitePress 项目,不在这里执行 Flutter 构建:
sh
dart format --output=none --set-exit-if-changed lib test
flutter analyze
flutter test性能排查
在目标设备上用 profile 模式复现,避免直接依据 debug 模式判断最终性能:
sh
flutter run --profile -d <device-id>原生应用优先使用真机;Web 用目标浏览器及其性能工具单独测量。通过 Flutter DevTools 的时间线、重建统计和内存观察建立证据,入口见 官方 DevTools 指南。
| 观察到的问题 | 优先调查 | 可能的改进方向 |
|---|---|---|
| 构建耗时高 | 大范围状态订阅、构建中的同步工作 | 缩小订阅范围,移动计算或数据访问 |
| 布局耗时高 | 多次测量、复杂嵌套、无界滚动结构 | 简化布局,明确约束 |
| 栅格化耗时高 | 大图、复杂裁剪、模糊和过度绘制 | 合适的图片解码尺寸,减少昂贵效果 |
| 内存持续增长 | 控制器、订阅、缓存和大对象引用 | 明确释放和缓存淘汰策略 |
60 Hz 屏幕每帧约 16.7 ms,120 Hz 约 8.3 ms,这只是与刷新率对应的时间尺度。实际要看各阶段耗时、流水线与掉帧记录,不能仅凭总 CPU 占用判断。
RepaintBoundary 可以隔离部分绘制影响,也有图层与缓存成本;先测量再决定位置。大数据解析是否移入 isolate,同样需要考虑消息传递和 Web 支持等成本。
打包前记录环境
在应用项目中记录 Flutter/Dart 版本、依赖锁文件、构建参数、应用标识和目标平台。版本号在 pubspec.yaml 中设置,例如 version: 1.0.0+1;展示版本和构建号按目标平台规则映射。
客户端构建参数中不应放需要保密的服务端密钥,--dart-define 也不能使密钥保密。接口地址等公开配置可区分环境,真正的服务端凭据由服务端保管。
按目标平台构建
下列命令用于生成产物,仍需完成平台签名、应用配置与分发流程。平台要求会随工具链和商店更新,发布前核对官方指南。
| 平台 | 构建命令 | 产物及后续工作 |
|---|---|---|
| Android | flutter build appbundle | build/app/outputs/bundle/release/;配置发布签名与应用 ID,再上传分发平台 |
| Android 安装验证 | flutter build apk --release | build/app/outputs/flutter-apk/;使用已配置的发布签名验证安装与启动 |
| iOS | flutter build ipa | 需 macOS / Xcode;配置 Bundle ID、证书与描述文件,检查 build/ios/ipa/ |
| Web | flutter build web | 部署 build/web/;验证资源路径、缓存与深链接回退 |
交付验收
- 从冷启动进入首页,检查未登录、无网络和空数据场景。
- 执行列表搜索、详情编辑、取消返回和失败重试,确认没有重复提交。
- 彻底关闭后重新打开,检查偏好和业务数据的恢复策略。
- 在目标设备验证 release 产物的权限、网络和原生插件;Web 检查刷新及前进后退。
- 记录产物版本、关键截图、已知限制和回退方式,便于下一次发布对照。