flutter 单元测试

说测试之前先来扯点别的

flutter 的定位

这个flutter它绝对不是 想要做原生的东西

它是想要做一个完整的东西 它给自己的定位 是做一个完整的应用程序

我们现在有一个完整的app -> 完全迁移到 flutter里面成本太高了

所以 有了混合开发 单是它最终的定位是 开发一个完整的应用程序

现在就要学一些比较杂的东西了

国际化是比较麻烦的

当然有些公司是不要你来写的 它会有专门的测试员工来干

国内的公司经常不做测试 因为需求太多了 经常这个需求还没有做完下一个任务就下来了

但是这个和公司相关 有些公司还是要求 你要做完整的测试

国内的更多的是写需求啊 但是测试人员测试还是要写的

我们主要是讲一下 flutter里面是怎么来测试的

1.单元测试
2. widget测试
3. 集成测试

在项目中怎么来做测试 从不同的角度来怎么测试

这里我们首先创建一个新的项目 来到对应的 位置打开这个项目

我们这里只讲单元测试 其他的测试 我后面再整理

单元测试

要进行单元测试 需要先添加依赖

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NpYG1VJn-1589872255562)(7A135EE60E0C40529E5CA30DE7DB787B)]

但是它已经默认 添加了 这个依赖了

还有就是这个依赖的位置是在 dev_dependencies的依赖

这个位置的依赖 只会在开发阶段被打包 正常情况是不会被打包的

我们建立一些 类和方法看这个东西是怎么测试的

counter.dart

class Counter {
  int value= 0;

  int increment() => ++value;

  int decrement() => --value;
}

math_utils.dart

int sum(int num1, int num2) {
  return num1 + num2;
}

在我们开发的时候 如果我们不写测试的话 我们就会直接把这个东西放在某一个地方用了

然后直接检测这个是否按 想象的运行

  • 原来我用了一种检验方法 如果 代码有些地方不是和 想的结果 一样 我们就一步一步的查 看哪一步和我们想的结果不一样

我们如果要测试一个代码是否 有问题 我们可能会让它运行一下看他的结果是否和我们想的一样

class HYHomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print(sum(10, 20));

    return Scaffold(
      appBar: AppBar(
        title: Text("title")
      ),
      body: Center(
        child: Text("hello")
      ),
    );
  }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pm8uw7FS-1589872255567)(965D8282DC4442779A8B5653A6C502EC)]

这个是平常开发中用较多的一种形式

还有一种

 return Scaffold(
      appBar: AppBar(
        title: Text("title")
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Text("hello"),
            Text("${sum(10,20)}")
          ],
        )
      ),
    );

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWRbJlVZ-1589872255571)(87E4D999E5424889B65F43A6FFA9F0ED)]

但是一些测试要求较高的公司会 要求你去写一些单元测试

单元测试

  • 验证我们的这个东西
  • 不会污染原有的代码

我们的这些东西 直接项目中的时候它会污染 我们的项目代码

我们来到 test文件夹

在这里插入图片描述

我们的写在test代码是不会污染到 项目的代码

我们把默认情况下的代码 直接删掉 我们直接去写一些 自己的测试

在这里插入图片描述

这个测试文件 命名有一定的讲究

我们可以用测试的文件名 开头 然后以test结尾 中间用_分割

在这里插入图片描述

然后我们的测试代码也需要有入口方法

dart里面所有的代码执行都需要有入口

这个description是一个对代码的描述

import 'package:flutter_test/flutter_test.dart';

void main() {
  test(description, body)
}

在这里插入图片描述

显然这第一个东西就是一个描述

body就是要传入一个函数

import 'package:flutter_test/flutter_test.dart';

void main() {
  test("math_utils file test", () {
    
  });
}

如果你想执行这个测试 你点击这里就可以了

在这里插入图片描述

然后我们就可以写测试了

在其他的语言里面我们用的比较多是 assert 断言这个东西 但是flutter里面它会经常用这个assert来做一些事情 但是这个test它是用的 expect来做测试

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/math_utils.dart';

void main() {
  test("math_utils file test", () {
    final result = sum(20, 30);
    expect(result, matcher);
  });
}

我们这个expect要传两个参数 一个是结果 是一个匹配 参数

如果 结果和matcher一样那就通过 没有就不通过

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/math_utils.dart';

void main() {
  test("math_utils file test", () {
    final result = sum(20, 30);
    expect(result, 50);
  });
}

这样我们的 sum这个函数的测试就写完了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8zsRHG4-1589872255585)(59941F2596F749C78228ED7368D99E29)]

然后点击运行 我们在这里跑的话 我们不是不会污染我们的核心代码的

在这里插入图片描述

看到这个就表示测试已经正常通过了

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/math_utils.dart';

void main() {
  test("math_utils file test", () {
    final result = sum(20, 30);
    expect(result, 50);
  });

  test("math_utils file mul tests", () {
    final result = mul(20, 30);
    expect(result, 600);
  });
}

在这里插入图片描述

正常通过

然后我们这里才写了 两个测试代码 我们可以把它写到一起

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/math_utils.dart';

void main() {
  test("math_utils file test", () {
    final result1 = sum(20, 30);
    expect(result1, 50);

    final result2 = mul(20, 30);
    expect(result2, 600);
  });

}

但是我们一般是单独的功能单独放到一个测试里面

但是如果我们又想放到一起运行呢

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/math_utils.dart';

void main() {
  group("test math utils file test", () {
    test("math_utils file test", () {
      final result = sum(20, 30);
      expect(result, 50);
    });

    test("math_utils file mul tests", () {
      final result = mul(20, 30);
      expect(result, 600);
    });
  });
}

这样我们两个就都通过了

在这里插入图片描述

但是如果 没有通过呢

我们把加改成减

在这里插入图片描述

  • 发现一个问题 就是有些时候这个 测试的按钮 不出现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j1FJCxbF-1589872255593)(4B479547DD5B4590BF30AD371F3C70B6)]

这个时候我们可以到 上面去测试

在这里插入图片描述

选择你要测试文件的描述

在这里插入图片描述

然后点击它

在这里插入图片描述

你会发现现在这里就报错了

在这里插入图片描述

它这里就告诉我们 一个程序出错了

怎么找到这个文件呢 我们可与看到它有一个层级关系

在这里插入图片描述

实际得到的值就是-10

所以我们找到对应的位置

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBSFdj7U-1589872255603)(455DC81D4CA148B98689650BDF50FCBE)]

这样就把错误检查了 这个东西就没有问题了

我们就可以把这个东西放心大胆到核心大胆的去使用了

然后就是这个counter的测试

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/counter.dart';

void main() {
  test("counter test", () {
    final counter = Counter();

    expect(counter.value, 0);
  });
}

在这里插入图片描述

跑一下

然后这个就正常通过

在这里插入图片描述

但是我们不只是想测试一下值 我们还想测试一下 counter

我们要测试多个东西的话我们用group

但是这里有一个问题 我们如果想要讲这个counter初始化 那么我们最好初始化一次

但是我们我们在test外面初始化的话我们的 这个初始化代码很有可能在初始化之前 这个测试代码就已经讲 测试代码运行完了 所以我们最好找一个地方将初始化代码运行完

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/counter.dart';

void main() {
  group("counter Class Test", () {
    test("counter test", () {
      Counter counter;

      setUpAll(() {
        final counter = Counter();
      });

      expect(counter.value, 0);
    });
  });
}

这样它就会在所有的test开始前会执行的代码

这样它在里面就是会做一些初始化工作了

import 'package:flutter_test/flutter_test.dart';
import 'package:testsample/counter.dart';

void main() {
  group("counter Class Test", () {
    Counter counter;
    setUpAll(() {
      counter = Counter();
    });

    test("counter value test", () {
      expect(counter.value, 0);
    });

    test("counter increment method", () {
      counter.increment();
      expect(counter.value, 1);
    });

    test("counter decrement", () {
      counter.decrement();
      expect(counter.value, 0);
    });
  });
}

在这里插入图片描述

这样公共用一个对象它是会将保存的结果 保留的 不会重新创建

它这里是按照顺序进行执行的 它们都指向的是上面的counter

我们的这个逻辑是没有问题的

我们写测试就是对代码健壮性的考虑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值