测试生命周期与分组

在 Dart 测试中,合理地组织测试用例并管理它们的生命周期(初始化与销毁)是保持测试代码整洁、高效的关键。我们通过 group 来分类,通过 setUptearDown 来控制环境。

  • group: 将相关的测试组织在一起。组内可以嵌套组,形成树状结构。
  • setUp: 在每个测试用例执行前运行,用于初始化数据库、实例化类等。
  • tearDown: 在每个测试用例执行后运行,用于关闭流、清空临时文件等。
  • setUpAll: 在该组的所有测试开始前运行一次,通常用于耗时的全局初始化(如启动服务器)。
  • tearDownAll: 在该组的所有测试结束后运行一次。
// lifecycle_test.dart
import 'package:test/test.dart';

void main() {
  // 全局生命周期
  setUpAll(() {
    print('>> 🚀 启动全局模拟服务器');
  });

  tearDownAll(() {
    print('>> 🛑 关闭全局模拟服务器');
  });

  group('用户模块测试', () {
    late Map<String, String> userData;

    // 组内生命周期:每个测试运行前都会重置数据
    setUp(() {
      print('  -- 准备用户测试数据');
      userData = {'id': '1', 'name': 'Alice'};
    });

    tearDown(() {
      print('  -- 清理用户测试数据');
      userData.clear();
    });

    test('数据初始化正确', () {
      expect(userData['name'], 'Alice');
    });

    test('可以修改用户名', () {
      userData['name'] = 'Bob';
      expect(userData['name'], 'Bob');
    });

    // 嵌套组
    group('权限检查', () {
      setUp(() {
        print('    --- 额外添加权限标签');
        userData['role'] = 'admin';
      });

      test('管理员权限校验', () {
        expect(userData['role'], 'admin');
      });
    });
  });
}

/* Debug Output:
>> 🚀 启动全局模拟服务器
  -- 准备用户测试数据
  -- 清理用户测试数据
✓ 用户模块测试 数据初始化正确
  -- 准备用户测试数据
  -- 清理用户测试数据
✓ 用户模块测试 可以修改用户名
  -- 准备用户测试数据
    --- 额外添加权限标签
  -- 清理用户测试数据
✓ 用户模块测试 权限检查 管理员权限校验
>> 🛑 关闭全局模拟服务器
*/

Reference