Flutter 单元测试简单总结

分享 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/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注