Flutter 必不可少的自动化测试
Flutter中包含了三种测试分类:
- 单元测试 Unit Test
- Widget测试 Widget Test
- 集成测试 Integration Test
一般来说,一个测试良好的App应该包含很多的单元测试和Widget测试,来达到较高的代码覆盖率,然后再加上足够的集成测试来覆盖所有重要的使用场景。下图展示了三种测试分类从修复难度、外部依赖、执行速度、可信任度四个方面的特点,
下面分别说明三类测试的一般性规则和编写方式。
事先添加好测试相关的依赖:
dev_dependencies:
flutter_test:
sdk: flutter
# 测试依赖
# 单元测试
test: ^1.14.4
# 集成测试
integration_test: ^1.0.1
单元测试
单元测试是测试一个单独的功能、方法或类。
单元测试目的是是验证一段代码逻辑在不同输入条件下的正确性。
如果在单元测试有外部依赖,一般通过mocked方式解决。
单元测试中一般不应读写磁盘、渲染屏幕、接收用户输入。
单元测试和Widget测试代码都放在test目录下。
假设有一个验证手机号格式的方法:
class ValidateUtil {
///验证手机号格式
static Future<bool> isMobile(String mobile) async {
if (mobile == null || mobile.length == 0) {
return false;
}
RegExp mobileRegExp = RegExp(r"1\d{10}$");
return mobileRegExp.hasMatch(mobile);
}
}
为此方法添加一个单元测试如下:
import 'package:test/test.dart';
void main() {
group('All validate util method test', () {
test('One correct mobile should pass', () async {
String mobile = '15330059740';
bool result = await ValidateUtil.isMobile(mobile);
expect(result, true);
});
});
}
执行单元测试的命令如下:
//执行指定文件中所有的测试用例
flutter test test/utils/validate_util_test.dart
//执行所有的单元测试
flutter test
执行结果如下图所示:
Widget测试
Widget测试,也可以叫做组件测试,是测试一个单独的UI控件。
Widget测试的目的是验证Widget是否显示正常、是否正常交互。
Widget测试依赖测试环境来提供Widget的声明周期上下文。
为Widget测试提供的测试环境,比正式的、完整的UI系统要简单的多。
Widget测试时Flutter独有的,可以在其中测试每个选中的单独的Widget。
和单元测试不同,Widget测试使用testWidget()方法声明一个测试用例,Widget测试使用TestFlutterWidgetBinding类来提供类似于真实运行环境的资源,例