You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter测试执行顺序混淆:Future<void>先于测试组运行

Flutter测试中数据库删除操作执行时机异常的原因

问题场景

我在Flutter项目测试文件夹中有以下代码:

group('beneficiary methods tests', () {
  test('insert beneficiary test', () async {…});
  test('update beneficiary test', () async {…});
  test('get beneficiary test', () async {…});
});

await deleteDatabase('testingDB');

原本期望代码按逐行顺序执行,数据库删除操作在所有测试完成后再运行,但实际并非如此。测试依赖该数据库,运行时抛出如下错误:

SafLiteFfiException(error,
Bad state: This database
has already been closed})

将await deleteDatabase('testingDB');移到group上方后错误得以解决,想了解该行为的原因。

原因分析

  • 测试框架的异步注册机制:group和test函数的作用是注册测试任务,而非立即同步执行测试内容。调用group时,测试框架只是把内部的测试用例加入到待执行队列,不会阻塞当前代码等待测试全部跑完。
  • 原代码的执行顺序:代码会先执行group完成测试注册,紧接着就执行await deleteDatabase操作——此时测试用例可能还未启动,或者正在运行的测试还在操作数据库,就被提前删除关闭,直接触发了“数据库已关闭”的异常。
  • 调整位置后的逻辑:把删除操作移到group上方后,会先完成数据库删除(此时测试还未注册执行),之后测试框架注册并运行测试时,测试代码会重新创建或打开数据库,自然不会出现已关闭的冲突问题。

内容的提问来源于stack exchange,提问作者mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:15:58