谈一谈Flutter UI 测试

跨平台移动app开发框架的测试通常是具有挑战的,因为测试需要跨多个平台。flutter提供了丰富的测试功能。包括单元测试、小部件测试和集成测试。在标准的测试金字塔模型中,集成测试是在单元测试之后进行的,开发测试多个模块的集成。在flutter中,集成测试等同于ui测试。在flutter中ui测试被称作集成测试。但是在这里我们使用ui测试。与此同时,自动化测试工具也不再是比较陌生的行业,越来越频繁的进入大众的视线,获得更多的关注和认可。
如何在flutter执行ui测试?
在flutter中,ui测试被称作集成测试。flutter集成测试类似ios的xcuitest或android的expresso一样来执行ui自动化测试。flutter的集成测试在一个单独的环境运行,可以运行在真实的设备或者模拟器上面。flutter提供了一个flutter_driver包来编写ui测试。
flutter应用程序的ui测试是如何执行ui测试:
flutter ui测试作为黑盒运行,与主应用程序分开的线程运行。
flutter ui测试无法访问flutter应用程序的数据或api,这给flutter ui测试带来了额外的挑战。
flutter ui测试准备工作:
首先,必须创建应用程序的测试版本,并将它部署到真机或模拟器中。
然后,通过测试套件驱动应用程序,flutter_driver编写测试用例。
flutter driver 启动本地服务运行测试,可以看到测试日志。
启动flutter ui tests
在创建一个新的flutter项目时,默认flutter模板并不包括ui测试库,需要先添加ui测试库,为了可以行ui测试,我们需要完成以下任务:
得到 flutter_driver 包。
设置测试目录
创建测试应用程序
通过flutter_driver提供的api编写ui
在真机或模拟器中执行ui测试
获得 flutter_driver 包
在pubspecyaml文件中添加flutter_driver 的依赖dev_dependencies。 dev_dependencies:
flutter_driver:
sdk: flutter
完成上面配置后,运行命令下载包:$ flutter packages upgrade
这个命令将下载 flutter_driver包的最新,并且锁版本在pubpeclock文件。现在可以在项目中使用flutter_driver了。
设置ui测试目录
现在可以创建一个flutter ui测试目录了,这个目录通常叫test_diver。在这该目录下创建两个文件:
一个是应用程序文件maindart,另一个是用于测试应用程序的ui测试文件main_testdart。 $ mkdir test_driver
$ touch test_drivermaindart
$ touch test_drivermain_testdart
创建应用程序
打开maindart 编写简单的demo。import 'package:flutter_driverdriver_extensiondart';
import 'package:flutter_demomaindart' as app;
void main() {
enableflutterdriverextension();
appmain();
}
这段代码将启动app并检测版本。
编写ui测试
有了应用程序,就可以用flutter driver编写ui测试了。参考文档:
flutterdevdocscookbooktestingintegrationintroduction#5-write-the-tests
分四个步骤:
在setup中连接app驱动
在teardwon方法断开app连接
使用serializablefinder查找widget
使用expect断言信息
打开main_testdart文件编写测试: void main() {
group('home screen test', () {
flutterdriver driver;
setupall(() async {
connects to the app
driver = await flutterdriverconnect();
});
teardownall(() async {
if (driver != null) {
closes the connection
driverclose();
}
});
test('verify the text on home screen', () async {
serializablefinder message = findtext("you have pushed the button this many times:");
await driverwaitfor(message);
expect(await drivergettext(message), "you have pushed the button this many times:");
});
});
}
这里测试的是flutter默认的应用程序,codemagic-demo。
运行测试
在运行测试之前需要连接一个真机或模拟器。准备好这后,通过下面命令运行测试。$ flutter driver --target test_drivermain_testdart
运行测试时会发生以下情况:
flutter driver连接app到 :127001:50669
开始接收驱动程序的命令并执行相应的行动
一次测试结束连接断开