分享 Flutter 单元测试一些常见需求。就我使用 Flutter 这段时间,这几个地方会用到测试,首先是一些简单,需要快速验证的 Dart 代码。其次,对项目中的方法函数进行测试,有的特殊情况,测试函数需要传入BuildContext
作为参数。
快速执行 Dart 代码
这种情况实际很常见,比如对 API 的使用,编写测试工具类等等,都可以放到单元测试中去做,直接运行单个方法,不用运行整个项目。它的做法就是利用 Flutter 的单元测试,先依赖。
dev_dependencies:
flutter_test:
sdk: flutter
再创建 Dart 文件
编写 Dart 测试代码,主要用到 test();
,它就是用来运行单元测试的函数,有点像其他语言的 @Test
,需要填写两个参数,第一个参数是字符串描述,第二个是无参无返回值的方法,方法里面就是要执行的 Dart 代码。
void main(){
test("simple test api", (){
String s = "hello world";
print(s.split(" ")[0]);
});
}
测试功能方法函数
上面不涉及项目代码,我们接着对项目开发的代码做单元测试,其实和上面一样的。现在我在项目中写了一个被测试的类 MyTestClass
,位置在 lib
。
class MyTestClass{
int i = 0;
void add() => i++;
void sub(int num){
i = i -num;
}
}
还是用刚才的测试类,我添加以下测试方法,如此就实现了对项目函数的测试。
test("this is a unit test..", (){
MyTestClass myTestClass = MyTestClass();
myTestClass.add();
myTestClass.sub(3);
print(myTestClass.i);
});
但现在有一个问题,假如我们在 Flutter 测试类需要用到 BuildContext
呢,也就是上下文 context
这个参数需要传入到待测试的方法中。比如要在单元测试中加载获取本地文件、获取屏幕分辨率都需要用到这个参数。
class MyTestClass{
void getTheme(BuildContext context){
///Theme.of(context) //获取主题
print(Theme.of(context));
}
}
上面是待测试的方法,获取主题,要在单元测试调用此方法,则需要传入BuildContext
,这该怎么做呢?我这直接提供代码,有这个需求的,可以参考。
testWidgets("unit testing need buildContext", (WidgetTester widgetTester) async {
await widgetTester.pumpWidget(Builder(builder: (BuildContext context){
MyTestClass myTestClass = MyTestClass();
myTestClass.getTheme(context);
return Container();
}));
});
测试 Widget
前面我们使用 test
做执行测试方法,这个 Widget 的测试要用到 testWidgets
。对,就是如上提到的,获取 BuildContext
的方法。关键代码如下:
testWidgets("unit testing need buildContext", (WidgetTester widgetTester) {
});
和 test
一样都得填描述字符串这个参数,第二个参数也是一个方法,但不一样的是,这个方法有参数 WidgetTester
,这个参数提供了非常多的 API 可以操作 Widget 。像上面的 widgetTester.pumpWidget(Widget)
就是构造 Widget 。相当于 build
绘制出需要的 Widget。
await widgetTester.pumpWidget(Container());
因为上面代码需要用到 BuildContext
,所以我就用 Builder
来构造绘制 Widget ,这里就看自己需求。
测试页面控件 Widget 和用户交互这块内容因为没需求,加上官方案例我还没跑通,先将链接贴在这。
本文由老郭种树原创,转载请注明:https://guozh.net/unit-testing-in-flutter/