必要性

作为一个开发,对自己开发的功用进行单元测验对错常有必要的。单元测验是软件开发中一种必要的测验办法。它旨在测验一个独自的模块或组件的功用。单元测验通常是自动化的,并且能够在开发进程中进行频频的测验。在本文中,咱们将探讨单元测验的必要性以及为什么它是软件开发中不可或缺的一部分。

  1. 验证代码的正确性

在编写代码时,开发人员往往会犯过错。这些过错可能是语法过错,逻辑过错或其他类型的过错。单元测验能够协助开发人员及时发现这些过错。经过编写单元测验,开发人员能够验证代码是否按照预期履行,并且能够及早发现和处理过错。

  1. 进步代码质量

单元测验能够协助开发人员编写更高质量的代码。编写单元测验需求开发人员细心考虑每个功用点,并保证代码的每个方面都被测验到。经过这个进程,开发人员能够发现并处理潜在的问题,并保证代码的质量得到进步。

  1. 支撑重构和改善

在软件开发的生命周期中,代码经常需求进行重构和改善。单元测验能够协助开发人员在进行这些更改时保证代码的正确性。如果重构或改善代码后,单元测验依然能够经过,那么开发人员就能够确信代码的行为没有发生变化。这种自信能够让开发人员更加轻松地进行代码更改,并削减因为更改而引进过错的危险。

  1. 进步代码的可保护性

单元测验能够进步代码的可保护性。经过编写单元测验,开发人员能够快速定位代码中的问题并进行修复。这能够使代码更简单保护,并削减开发人员需求花费的时刻和精力。在团队协作的状况下,单元测验还能够协助新成员更快地了解代码,并快速定位和处理问题。

总之,单元测验是软件开发中必不可少的一部分。它能够协助开发人员验证代码的正确性,进步代码质量,支撑重构和改善,并进步代码的可保护性。经过编写单元测验,开发人员能够保证代码的正确性和稳定性,并削减因为更改而引进过错的危险。

单元测验

  1. 安装测验框架

Flutter提供了自己的测验框架,称为flutter_test。在项目中运用flutter_test,需求在pubspec.yaml文件中添加依靠项:

dev_dependencies:
  flutter_test:
    sdk: flutter

然后,运转以下命令安装依靠项:

flutter packages get

当然在新创立的Flutter工程里,都会默许引证flutter_test并且创立好了test文件夹

从现在开始,对你的Flutter代码进行单元测试和微件测试

  1. 编写测验用例

测验用例是用来测验应用程序的各个部分的代码。在Flutter中,测验用例通常包含在一个独自的文件中。在这个文件中,你需求导入flutter_test库,并编写测验代码。以下是一个示例:

void main() {
  String time = testDate();
  print('time=' + time);
}
///查看到期时刻
String testDate() {
  String expiryDate = '-长期';
  List<String> list = (expiryDate).split('-');
  if (list.length == 2) {
    var start = list[0];
    var end = list[1];
    if (start.isEmpty || end.isEmpty) {
      return '';
    }
    if (start.length == 8) {
      start = DateTime.parse(start).format('yyyy.MM.dd');
    }
    if (end.length == 8) {
      end = DateTime.parse(end).format('yyyy.MM.dd');
    }
    return '$start-$end';
  }
  return (expiryDate);
}

在单元测验中,咱们能够给对应文件创立对应的测验文件。当咱们把数据核算解耦出来,就能够达到不需求UI的状况测验回来成果的状况。配合Mock数据能极大的进步功率。

  1. 进行微件测验 flutter_test还能够进行微件测验。 比方我写了一个Widget,这个Widget需求一个json来构建,而json中的一个字段会影响我Widget的创立.咱们需求查看这个Widget是否兼容这个json的所有状况.
void questionTitleWidgetTest() {
  testWidgets('questionTitle', (widgetTester) async {
    String path = '/Users/kfzs_002/Desktop/122.json';
    File file = File(path);
    String str = file.readAsStringSync();
    Map<String, dynamic> json = jsonDecode(str);
    Temp temp = Temp.fromJson(json);
    for (int i = 0; i < (temp.data?.list?.length ?? 0); i++) {
      var data = temp.data!.list![i];
      if ((data.questionTitleArr ?? []).isEmpty) {
        print('没有标题');
        continue;
      }
      await widgetTester.pumpWidget(
        MaterialApp(
          home: Material(
            child: QuestionTitleWidget(data: data.questionTitleArr ?? []),
          ),
        ),
      );
      print('index=$i');
      await widgetTester.pump();
    }
  });
}

履行测验办法,咱们就能在run窗口看到对应的数据成果。

有时咱们会写一个动画组件,它有复杂的动画我想查看动画相关参数是否正确。

void examCircleProgressTest() {
  testWidgets('examCircleProgressTest', (widgetTester) async {
    await widgetTester.pumpWidget(ScreenUtilInit(
      designSize: const Size(375, 812),
      minTextAdapt: true,
      useInheritedMediaQuery: true,
      builder: (context, child) => GetMaterialApp(
        home: Material(
          child: Row(
            children: [
              ExamCircleProgress(
                mTitle: 'title',
                subjectType: 2,
                progress: 30,
                subTitle: 'subtitle',
                score: '30',
              )
            ],
          ),
        ),
      ),
    ));
    // await widgetTester.pump();
    for (var i = 0; i < 2000; i += 33) {
      await widgetTester.pump(Duration(milliseconds: i));
    }
  });
}

这里我用到了widgetTester.pump.在Widget测验中,widgetTester.pump()办法是一个非常重要的办法,它的作用是将应用程序的状态推进到下一个时刻片段。我以33毫秒为距离,把这个Widget推进到了2秒后的状态。这样就能看到对应的数据状况了。