
作者:晚霞的不甘 日期:2025年12月5日 标签:Flutter · OpenHarmony · 自动化测试 · 单元测试 · 集成测试 · UI 测试 · CI/CD · 质量保障
在 OpenHarmony 多设备、多场景、高可靠性的要求下,“能跑”不等于“可用”。 一个未被充分测试的 Flutter 应用可能:
自动化测试不是成本,而是对稳定性的投资。
本文构建一套分层、可扩展、可集成的测试体系,覆盖 Dart 逻辑、UI 交互、OpenHarmony 原生能力、多设备兼容性 四大维度,助你实现 90%+ 测试覆盖率、每日自动回归、上线零重大缺陷 的质量目标。
┌──────────────────────┐
│ E2E / UI 测试 │ ← 10%(高成本,低频)
├──────────────────────┤
│ 集成测试 │ ← 20%(验证模块协作)
├──────────────────────┤
│ 单元测试 │ ← 70%(快速反馈,高覆盖)
└──────────────────────┘✅ 黄金法则:
test(官方)mocktail(无反射,兼容 Flutter Web & OH)flutter test --coverage// feature_health/domain/use_cases/fetch_health_data_test.dart
void main() {
late MockHealthRepository mockRepo;
late FetchHealthDataUseCase useCase;
setUp(() {
mockRepo = MockHealthRepository();
useCase = FetchHealthDataUseCase(mockRepo);
});
test('should return health data when repository succeeds', () async {
// Arrange
final testData = HealthData(heartRate: 72);
when(() => mockRepo.getHealthData()).thenAnswer((_) async => testData);
// Act
final result = await useCase();
// Assert
expect(result, equals(testData));
verify(() => mockRepo.getHealthData()).called(1);
});
}运行并生成报告:
flutter test --coverage
genhtml coverage/lcov.info -o coverage/htmlflutter_testtestWidgets('HealthPage shows heart rate', (tester) async {
// Arrange
final useCase = MockFetchHealthDataUseCase();
when(() => useCase()).thenAnswer((_) async => HealthData(heartRate: 80));
// Act
await tester.pumpWidget(
MaterialApp(
home: HealthPage(fetchData: useCase),
),
);
// Assert
expect(find.text('心率: 80'), findsOneWidget);
expect(find.byIcon(Icons.favorite), findsOneWidget);
});tester.view.size 模拟不同屏幕)integration_test 包// test_driver/app_test.dart
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('User can navigate to health report', (tester) async {
await app.main(); // 启动完整应用
await tester.pumpAndSettle();
// 点击健康 Tab
await tester.tap(find.text('健康'));
await tester.pumpAndSettle();
// 验证报告页面加载
expect(find.text('本周健康摘要'), findsOneWidget);
});
}# 在 OpenHarmony 设备上运行
flutter drive \
--driver=test_driver/integration_test.dart \
--target=integration_test/app_test.dart \
--platform=openharmony⚠️ 注意:集成测试需真实或模拟的 OpenHarmony 环境。
对于自定义插件(如 oh_health_sensor):
@ohos:hypium 编写原生测试// oh_health_sensor/test/OhHealthSensorPlugin.test.ets
import { describe, it, expect } from '@ohos:hypium';
describe('OhHealthSensorPlugin', function () {
it('getModel returns valid string', function () {
const model = deviceInfo.deviceModel;
expect(model).isNotEmpty();
});
});华为提供 远程真机集群,支持:
# .devcloud/pipeline.yaml
stages:
- name: Compatibility Test
steps:
- script: |
for device in watch phone car tv; do
flutter drive \
--target=integration_test/smoke_test.dart \
--device-id=$device \
--platform=openharmony
done设备 | 验证重点 |
|---|---|
手表 | 内存 ≤ 50MB,启动 ≤ 2s |
车机 | 横屏布局正确,焦点导航可用 |
智慧屏 | 字体 ≥ 20sp,遥控器可操作 |
手机 | 横竖屏切换无异常 |
stages:
- test
- build
- deploy
unit_test:
stage: test
script:
- flutter test --coverage
- genhtml coverage/lcov.info -o report
artifacts:
paths: [report/]
ui_test:
stage: test
script:
- flutter test test/widget/
integration_test_oh:
stage: test
script:
- hdc shell aa start -b com.example.app # 安装到连接设备
- flutter drive --target=integration_test/app_test.dart --platform=openharmony✅ 所有新功能必须附带单元测试
✅ 核心页面必须有 Widget Test
✅ 每次 PR 触发 CI 全量测试
✅ 每日凌晨执行真机兼容性巡检
✅ 测试代码与业务代码同生命周期维护
✅ 禁止提交 // ignore: test 注释
每一行测试代码,都是对用户的一份承诺: “这个功能,我确认它在各种情况下都能正常工作。”
🧪 行动建议:
因为可靠的体验,始于一行测试,成于千次验证。
附录:常用命令速查
场景 | 命令 |
|---|---|
运行单元测试 | flutter test |
生成覆盖率报告 | flutter test --coverage && genhtml coverage/lcov.info -o coverage/html |
运行 Widget Test | flutter test test/widget/ |
运行集成测试(OH) | flutter drive --target=integration_test/xxx.dart --platform=openharmony |
查看连接设备 | hdc list targets |
没有测试的代码,如同没有护栏的悬崖——看似高效,实则危险。