一、前言
移动应用的测试往往比较复杂且工作量很大,为了验证用户的真实使用体验往往需要跨越多个平台以及不同的物理设备手动测试。随着产品功能不断迭代累积,测试的复杂度随之大幅增长,手动测试会变得更加困难。因此,编写自动化测试用例对我们的项目更新、迭代有着非常重要的作用。
二、单元测试
单元测试是指对软件中的最小可测试单元进行验证的方式,使用单元测试可以验证单个函数、方法或类的行为。我们来看看 Flutter 项目的工程目录:
如上图所示,lib 是 Flutter 应用源文件目录,test 是测试文件目录。接下来我们看看编写单元测试用例的步骤。
2.1 相关步骤
2.1.1 添加依赖
Flutter 工程默认添加了 flutter_test package,如果是 dart package 没有依赖 Flutter,可以导入 test package,示例代码如下:
dev_dependencies:
flutter_test:
sdk: flutter
//or
test:
2.1.2 声明一个用来测试的类
在 lib 目录下新建一个 dart 文件,声明一个用来测试的类,示例代码如下:
//unit.dart
class Counter {
int value = 0;
void increment() => value++;
void decrement() => value--;
}
2.1.3 编写测试用例
在 test 目录下创建一个 dart 文件(文件名建议已 _test 结尾),编写测试用例。测试用例通常包含含定义、执行和验证步骤,示例如下:
//unit_test.dart
import 'package:flutter_unit_test/unit.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
//第一个用例,判断Counter对象调用increase方法后是否等于1
test('Increase a counter value should be 1', () {
final counter = Counter();
counter.increase();
expect(counter.count, 1);
});
//第二个用例,判断1+1是否等于2
test('1+1 should be 2', () {
expect(1 + 1, 2);
});
}
可以看到验证需要使用 expect 函数,将最小可测单元的执行结果与预期进行比较。 另外,测试用例需要包装在 test() 内部,test 是 flutter 提供的测试用例封装类。
2.1.4 启动测试用例
选择 unit_test.dart 文件,在右键弹出的菜单中选择 “Run ‘tests in widget_test’”,就可以启动测试用例了。运行结果如下:
接下来我们修改下测试用例代码,如下:
void main() {
//第一个用例,判断Counter对象调用increase方法后是否等于1
test('Increase a counter value should be 1', () {
final counter = Counter();
counter.increase();
expect(counter.count, 2);
});
//第二个用例,判断1+1是否等于2
test('1+1 should be 2', () {
expect(1 + 1, 2);
});
}
可以看到,我们将第一个用例的 1 修改成 2 来制造一个错误,现在来看看测试用例执行不通过的提示:
2.1.5 组合测试用例
如果有多个测试用例,它们之间存在关联关系,可以在外层使用 group 函数将它们组合在一起,示例代码如下:
void main() {
//组合测试用例,判断Counter对象调用increase方法后是否等于1,
// 并且判断Counter对象调用decrease方法后是否等
group('Counter&