Dart/Flutter测试是同步还是异步执行?test runner运行逻辑问询
Flutter/Dart test runner 测试执行逻辑说明
1. 单测试的同步/异步支持
Dart测试框架同时支持同步和异步测试:
- 同步测试按普通Dart同步代码逻辑执行,执行完所有同步代码即判定测试结束
- 异步测试只需给测试函数加上
async关键字,框架会自动等待测试函数返回的Future完成后再判定测试结束,异步过程中抛出的异常也会被正常捕获作为测试失败的依据
2. 测试/套件的并发执行规则
默认配置下执行逻辑符合你提到的第三种情况:同测试套件(同个测试文件)内串行执行,不同测试套件(不同测试文件)并行执行,具体规则如下:
- 同个测试文件内的所有测试,严格按代码声明顺序串行执行,任意时刻仅运行该文件内的一个测试,对应同文件内的
setUp/tearDown会在每个测试运行前后分别执行,不会出现同文件多个测试的生命周期函数交叉执行的情况 - 不同测试文件会被框架分配到独立的Dart Isolate中并行运行,默认并发数和设备CPU核心数匹配,你也可以通过
dart test -j <并发数>的命令参数手动调整并发上限,比如指定-j 1即可全局禁用并行,所有测试按顺序串行执行 - 不同测试文件因为运行在独立Isolate中,内存空间完全隔离,各自的全局变量、
setUpAll/tearDownAll逻辑完全互不影响
测试代码设计注意事项
- 同文件内的测试如果依赖全局状态,要注意串行执行带来的状态传递问题,必要时在
setUp中重置状态,避免前一个测试的运行结果影响后一个测试的正确性 - 跨文件的测试不需要考虑状态互相干扰的问题,无需额外做隔离处理
内容的提问来源于stack exchange,提问作者Andrew Piterov
相关产品推荐
相关产品推荐

