Flutter 单元测试
软件测试是发现程序错误衡量软件质量必不少的一个环节,在企业中会有专门的软件测试工程师来负责软件测试和质量的障。作为一名Flutter开发人员了解Flutter测试的方法和手段有助于减少程序的Bug开发出更高质量的应用。那么Flutter是如何进行测试的呢?
在本篇教程中将下大家分享Flutter的主流测试方式以和案例,在Flutter中主要有以下三种类型的测试:
- 单元测试
- Widget测试
- 集成测试
单元测试
测试单一功能、方法或类,单元测试通常不会读取/写入磁盘、渲染到屏幕,也不会从运行测试的进程外部接收用户操作。单元测试的目标是在各种条件下验证逻辑单元的正确性。
如果所测试对象有外部依赖,那么外部依赖要能够被模拟出来,否则是无法进行单元测试。
所需依赖
dev_dependencies:flutter_test:sdk: flutter
案例
///单元测试
void main() {///测试HiCache的存储和读取test('测试HiCache', () async {//fix ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.TestWidgetsFlutterBinding.ensureInitialized();//fix MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)SharedPreferences.setMockInitialValues({});await HiCache.preInit();var key = "testHiCache", value = "Hello.";HiCache.getInstance().setString(key, value);expect(HiCache.getInstance().get(key), value);});
}
在这个案例中我们对项目中的缓存模块HiCache
进行了单元测试,主要用来测试它的存储和读取功能是否正常。
Widget测试
Widget 测试可以用于测试单独的 class, function, 和 Widget。
Widget测试具有一定的局限性,所测试的Widget必须要能够独立运行,或者所以依赖条件能够被模拟出来。
所需依赖
dev_dependencies:flutter_test:sdk: flutter
按照上述要求整个APP有哪些Widget能进行Widget测试?
案例
...
class UnKnownPage extends StatefulWidget {@override_UnKnownPageState createState() => _UnKnownPageState();
}class _UnKnownPageState extends State<UnKnownPage> {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(),body: Container(child: Text('404'),),);}
}
...
///Widget测试
void main() {testWidgets('测试UnKnownPage', (WidgetTester tester) async {//UnKnownPage虽然没有Flutter框架之外的依赖,但因为用到了Scaffold所以需要用MaterialApp包裹await tester.pumpWidget(MaterialApp(home: UnKnownPage()));expect(find.text('404'), findsOneWidget);});
}
在这个案例中我们对项目中的UnKnownPage
Widget进行了测试,主要用来测试该页面中是否存在一个内容为404的Text。
集成测试
集成测试主要是测试各部分一起运行或者测试一个应用在真实设备上运行的表现的时候就要用到集成测试。
所需依赖
dev_dependencies:flutter_test:sdk: flutterintegration_test:sdk: flutter
主要步骤
- 添加测试驱动
- 编写测试用例
- 运行测试用例
- 查看结果
添加测试驱动
添加测试驱动的目的是为了方便通过flutter drive命令运行集成测试:
在项目根目录创建test_driver
目录并添加文件integration_test.dart
:
import 'package:integration_test/integration_test_driver.dart';
Future<void> main() => integrationDriver();
编写测试用例
在项目根目录创建integration_test
目录并添加文件app_test.dart
。接下来我们就来测试下登录模块的跳转功能:
import 'package:flutter/material.dart';
import 'package:flutter_bili_app/main.dart' as app;
import 'package:flutter_bili_app/navigator/hi_navigator.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';void main() {IntegrationTestWidgetsFlutterBinding.ensureInitialized();testWidgets('Test login jump', (WidgetTester tester) async {//构建应用app.main();//捕获一帧await tester.pumpAndSettle();//通过key来查找注册按钮var registrationBtn = find.byKey(Key('registration'));//触发按钮的点击事件await tester.tap(registrationBtn);//捕获一帧await tester.pumpAndSettle();await Future.delayed(Duration(seconds: 3));//判断是否跳转到了注册页expect(HiNavigator.getInstance().getCurrent().routeStatus,RouteStatus.registration);//获取返回按钮,并触发返回上一页var backBtn = find.byType(BackButton);await tester.tap(backBtn);await tester.pumpAndSettle();await Future.delayed(Duration(seconds: 3));//判断是返回到登录页expect(HiNavigator.getInstance().getCurrent().routeStatus, RouteStatus.login);});
}
在这个案例中我们通过获取当前页APP页面上的帧,然后基于捕获的这一帧查找到对应控件,并模拟了点击。为了能够判断登录模块的跳转逻辑是否正常在上述代码中我们通过HiNavigator
获取到当前的页面路由状态来进行判断。
运行测试用例
运行集成测试的测试用例可以通过以下命令来完成:
flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart
- –driver:用于指定测试驱动的路径;
- –targe:用于指定测试用例的路径;
下面实现运行效果图:
如果APP之前已经登录过那么需要将其先卸载来清除登录缓存,以便APP能够在测试的时候正常进入到登录页。
最后
- Integration testing:Integration testing | Flutter
- Flutter 集成测试example:https://github.com/flutter/plugins/tree/master/packages/integration_test/example
Flutter 单元测试相关推荐
- 暴力突破 Flutter 自动化测试
一.前言 移动应用的测试往往比较复杂且工作量很大,为了验证用户的真实使用体验往往需要跨越多个平台以及不同的物理设备手动测试.随着产品功能不断迭代累积,测试的复杂度随之大幅增长,手动测试会变得更加困难. ...
- StudyFlutter——我的第一个APP
一个菜鸟的第一个Flutter APP,本文大部分设计摘抄自一周时间编写你的第二个 Flutter APP.由于对于Dart和Flutter缺乏基本的熟悉,基本上算是以实战来作为学习方法,因此部分代码 ...
- Flutter 1.17 | 2020 首个稳定版发布!
作者 / Chris Sells, Product Manager, Flutter developer experience 很高兴为大家带来 Flutter 1.17,这也是我们 2020 年的第 ...
- 一个很棒的Flutter学习资源列表
目录 文章 一开始 HOWTO文档 网站/博客 高级 视频 组件 演示 UI 材料设计 图片 地图 图表 导航 验证 文字和富文本 分析.流量统计 自动构建 风格样式 媒体 音频 视频 语音 存储 获 ...
- Effective Dart 文档注释在Flutter项目中的实践
前言 什么是注释? 在编程语言中,注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码. 也有一句话是这样说的:程序员都讨厌两件事,1.别人不写注释 2.自己写注释 在开发者社区里,我不止 ...
- 使用Model-View-ViewModel使用Dart Streams使Flutter中的代码更清晰
by QuickBird Studios 通过QuickBird Studios 使用Model-View-ViewModel使用Dart Streams使Flutter中的代码更清晰 (Use Mo ...
- 可以进行单元测试么_大量实例助攻,让你的单元测试更高效
关注[搜狐技术产品]公众号,第一时间获取技术干货 导读 单元测试作为程序员的必修课,对代码的稳定性起着关键性的作用,但是你真的会写单元测试么?什么才算是真正的单元测试?这些疑问你都将在文章中得到解答. ...
- Flutter 1.17版本重磅发布
Flutter 1.17 是2020年的第一个稳定版本,此版本包括iOS平台Metal支持(性能更快),新的Material组件,新的Network跟踪工具等等! 对所有人来说,今年是充满挑战的一年. ...
- Flutter中的依赖注入——get_it
Flutter社区的一个library: get_it 视频介绍:Flutter Dependency Injection For Beginners | Complete Guide 视频对应的博文 ...
最新文章
- django之全文检索
- Ispur服务器收集系统日志,centos 7.2往rsyslog服务器端发送系统日志
- 通过AOP控制事务的案例
- ORA-12516 TNS: 监听程序找不到符合协议堆栈要求的可用处理程序
- 到底哪种类型的错误信息会阻止business transaction的保存
- 消费金融资金断流,银行抽贷、通道暂停,P2P离场
- centos7系统根目录扩容
- 如何利用华为交换机配置SSH登录
- arduino声音传感器与二极管_Arduino声音传感器
- 【PS】免费 使用PS批量将pdf转换成图片 pdf转图片 pdf转jpg pdf转png
- cada0图纸尺寸_a0图纸尺寸
- 软件观念革命:交互设计精髓_电子沙盘设计主要分为哪几种?
- 英文对于程序员的重要性
- 策略和投资组合分析-收益分析、风险回报分析和回撤分析
- 敏捷开发中,团队成员认领的是任务还是用户故事?
- springboot+特色农产品电商平台 毕业设计-附源码211515
- 微信公众号文章怎么添加附件|详细教程讲解,太实用了!
- 垃圾分类小程序,识别和站点查询,答题,用户后台管理集一体的小程序
- centos7配置端口转发
- 【面经攒人品】蚂蚁金服—反洗钱岗