深色模式
Flutter 单元测试 
起步 
yaml
dev_dependencies:
  flutter_test:
    sdk: flutter举例 
为Counter类,写单元测试:
dart
class Counter {
  int _count = 0;
  int get count => _count;
  void increment() {
    _count++;
  }
  void decrement() {
    if (_count > 0) _count--;
  }
  void reset() {
    _count = 0;
  }
}dart
import 'package:flutter_test/flutter_test.dart';
import 'counter.dart';
void main() {
  // 定义一个 Counter 变量
  late Counter counter;
  // 在所有测试之前运行一次的 setupAll 函数
  setUpAll(() {
    print('setUpAll: 在所有测试之前运行一次');
    // 这里可以进行一些全局性的初始化操作
  });
  // 在每个测试之前运行的 setup 函数
  setUp(() {
    print('setUp: 在每个测试之前运行');
    counter = Counter(); // 初始化 Counter 对象
  });
  // 测试 increment 方法
  test('测试 increment 方法', () {
    counter.increment();
    expect(counter.count, equals(1));
  });
  // 测试 decrement 方法
  test('测试 decrement 方法', () {
    counter.increment();
    counter.decrement();
    expect(counter.count, equals(0));
  });
  // 测试 reset 方法
  test('测试 reset 方法', () {
    counter.increment();
    counter.increment();
    counter.reset();
    expect(counter.count, equals(0));
  });
  // 在每个测试之后运行的 tearDown 函数
  tearDown(() {
    print('tearDown: 在每个测试之后运行');
    counter.reset(); // 将计数器重置为初始状态
  });
  // 在所有测试之后运行一次的 tearDownAll 函数
  tearDownAll(() {
    print('tearDownAll: 在所有测试之后运行一次');
    // 这里可以进行一些全局性的清理操作
  });
}初始化函数 
setUp:在每个测试开始前,执行一次setUpAll:在所有测试开始前,执行一次tearDown:在每个测试结束后,执行一次tearDownAll:在所有测试结束后,执行一次
常用断言函数 
核心函数:expect 
expect(actual, matcher, {reason, skip})作用: 检查实际值 (
actual) 是否符合给定的匹配器 (matcher)。使用场景: 这是最常用的断言函数,用于验证一个值是否符合预期。
示例:
darttest('expect example', () { var result = 42; expect(result, equals(42)); // 检查 result 是否等于 42 });
常用Matcher 
equals:
检查测试值是否等于某个期望值。
dart
expect(5, equals(5));  // PassesisTrue/isFalse:
检查布尔值是否为真/假。
dart
expect(true, isTrue);  // Passes
expect(false, isFalse);  // PassesisNull/isNotNull:
检查对象是否为null或非null。
dart
expect(null, isNull);  // Passes
expect('not null', isNotNull);  // PassesisA<T>():
检查对象是否是特定类型。
dart
expect('hello', isA<String>());  // Passes
expect(5, isA<int>());  // PassesisEmpty/isNotEmpty:
检查集合是否为空或非空。
dart
expect([], isEmpty);  // Passes
expect([1, 2, 3], isNotEmpty);  // Passescontains:
检查集合中是否包含某个元素。
dart
expect('hello world', contains('world'));  // Passes
expect([1, 2, 3], contains(2));  // PassesthrowsA:
用于测试期望抛出某种异常。
dart
expect(() => throw Exception('Error'), throwsA(isA<Exception>()));  // Passes集合相关Matcher 
listEquals:
检查List中的元素是否按顺序和值相等。
dart
expect([1, 2, 3], listEquals([1, 2, 3]));  // PassessetEquals:
检查集合中的元素是否相等,不考虑顺序,因为Set本身就是无序的。
dart
expect({1, 2, 3}, setEquals({3, 2, 1}));  // PassesunorderedEquals:
用于List,检查列表中的元素是否相等,但不考虑顺序。
dart
expect([1, 2, 3], unorderedEquals([3, 2, 1]));  // Passes数字相关Matcher 
closeTo:
用于浮点数比较,检查数值是否在某个范围之内。
dart
expect(10.0, closeTo(10.1, 0.1));  // PassesgreaterThan/lessThan/greaterThanOrEqualTo/lessThanOrEqualTo:
数值比较。
dart
expect(5, greaterThan(3));  // Passes
expect(5, lessThan(10));  // Passes
expect(5, greaterThanOrEqualTo(5));  // Passes
expect(5, lessThanOrEqualTo(5));  // Passes字符串相关Matcher 
startsWith/endsWith:
检查字符串是否以特定文本开始/结束。
dart
expect('hello world', startsWith('hello'));  // Passes
expect('hello world', endsWith('world'));  // Passesmatches:
使用正则表达式匹配字符串。
dart
expect('abc123', matches(RegExp(r'^[a-z]+\d+$')));  // Passes