Appearance
源码:labs/flutter/host/integration_test/app_boot_test.dart
- 原始路径:
labs/flutter/host/integration_test/app_boot_test.dart - 类型:
dart
dart
// ⚠️ 需要真机/模拟器:本文件是端到端集成测试,普通 `fvm flutter test`(只跑 test/)
// 不会执行它;请连接设备后按本目录 README.md 的说明运行。
import 'package:engineering_review_lab_flutter_host/app/app.dart';
import 'package:engineering_review_lab_flutter_host/l10n/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
/// 端到端集成测试(真实设备/模拟器运行)。
///
/// 运行方式:
/// ```bash
/// cd labs/flutter/host
/// fvm flutter test integration_test/app_boot_test.dart -d <device>
/// ```
///
/// 与 test/ 下 widget 测试的分工:
/// - widget 测试:纯 UI 页面的构建与导航冒烟(无插件、无真实网络)
/// - 集成测试:覆盖依赖平台插件 / 真实网络 / 真实生命周期的页面
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
Future<AppLocalizations> pumpApp(WidgetTester tester) async {
await tester.pumpWidget(const EngineeringReviewLabApp());
await tester.pumpAndSettle();
return tester.element(find.byType(Scaffold).first).l10n;
}
void goBack(WidgetTester tester) {
tester.state<NavigatorState>(find.byType(Navigator).first).pop();
}
testWidgets('应用在真实设备上启动并渲染首页 Lab 列表', (tester) async {
final l10n = await pumpApp(tester);
expect(find.text(l10n.homeAppBarTitle), findsOneWidget);
expect(find.text(l10n.homeItemLifecycleTitle), findsOneWidget);
});
testWidgets('PlatformChannel 页面在宿主上可打开且不崩溃', (tester) async {
final l10n = await pumpApp(tester);
// MethodChannel / EventChannel 依赖真实宿主实现,widget 测试跑不了,
// 这里验证真实设备上进入页面、触发一次电量读取不崩溃。
await tester.dragUntilVisible(
find.text(l10n.homeItemChannelTitle),
find.byType(ListView),
const Offset(0, -120),
);
await tester.tap(find.text(l10n.homeItemChannelTitle));
await tester.pumpAndSettle();
expect(find.byType(Scaffold), findsWidgets);
goBack(tester);
await tester.pumpAndSettle();
});
testWidgets('CachedNetworkImage 页面在真实网络下可渲染', (tester) async {
final l10n = await pumpApp(tester);
await tester.dragUntilVisible(
find.text(l10n.homeItemImageLoadingTitle),
find.byType(ListView),
const Offset(0, -120),
);
await tester.tap(find.text(l10n.homeItemImageLoadingTitle));
await tester.pumpAndSettle();
expect(find.byType(Scaffold), findsWidgets);
goBack(tester);
await tester.pumpAndSettle();
});
}