【发布时间】:2020-10-19 11:20:57
【问题描述】:
我正在为Flutter 编写的移动应用程序编写测试。
我关注this Flutter Cookbook 测试 Flutter 应用程序,学习如何编写小部件和集成测试。
本教程完美运行,但我仍然坚持自己的集成测试。
为简化起见,假设我有一个应用,只包含一个TextField:
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MyAppp',
home: Scaffold(
body: Center(child: TextField()),
),
);
}
}
我想为这个应用写一个测试。例如,我想测试以下场景:
- 打开应用
- 检查
TextField是否为空 - 选择
TextField - 输入“你好,世界!”
- 检查
TextField是否包含“hello, world!”
我写了以下Widget 测试,效果很好:
void main() {
testWidgets('TextField behavior', (WidgetTester tester) async {
// Create app
await tester.pumpWidget(MyApp());
// Find TextField, check there is 1
final textFieldFinder = find.byType(TextField);
expect(textFieldFinder, findsOneWidget);
// Retrieve TextField Widget from Finder
TextField textField = tester.widget(textFieldFinder);
// Check TextField is empty
expect(textField.controller.text, equals(""));
// Enter text
await tester.enterText(textFieldFinder, "hello, world!");
// Check TextField contains text
expect(textField.controller.text, equals("hello, world!"));
});
}
该测试通过了,但我想编写一个集成测试,或多或少做相同的事情,以便能够在真实设备上对其进行测试。 事实上,如果这个 Widget 测试通过,它可能会在所有设备上通过。但在我的应用中,我有更复杂的小部件和它们之间的交互,我希望能够在 Android 和 iOS 上启动测试。
我尝试使用Flutter driver 编写集成测试,但在文档和示例中没有找到我想要的。
如何检查Widget 属性,以验证我的应用程序是否按预期运行?
我写了以下示例:
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';
void main() {
group('TextField', () {
final textFieldFinder = find.byType('TextField');
FlutterDriver driver;
setUpAll(() async {
driver = await FlutterDriver.connect();
});
tearDownAll(() async {
if (driver != null) {
driver.close();
}
});
test('TextField behavior', () async {
// ??? how to check that the TextField is empty
await driver.tap(textFieldFinder);
await driver.enterText("hello, world!");
// ??? how to check that the TextField contains hello, world!
});
});
}
Flutter Cookbook 教程解释了如何通过 Text 检索对象,这将有助于检查 Text 是否存在,但例如是否可以检查 Container 颜色是否为红色? Widget 和 Integration 测试之间的界限在哪里?
编写 Widget 测试非常简单,但我没有找到很多关于如何使用 Flutter 驱动程序编写更复杂的集成测试的示例或文档。
【问题讨论】:
-
您无法在驱动程序测试中读取小部件的属性
-
我就是这么想的。但是,我们能真正测试什么?存在小部件,但不存在它们的内容?
-
您可以验证是否有匹配的文本。文本字段也有文本
-
是的,这是一个例子。我可以通过检索文本来测试它。但是如果我想测试另一个属性怎么办。如果我想检查在特定情况下是否启用了 TextField 怎么办? TextField 有一个 enabled 属性,我可以通过 Widget 测试轻松检查,但是如何使用 Flutter 驱动程序(或其他框架)执行设备测试来检查此属性?
标签: flutter flutter-test flutterdriver