首页 > 解决方案 > Dart/Flutter 测试是同步执行还是异步执行

问题描述

有人可以解释一下如何使用测试运行器执行 Flutter/Dart 测试吗?

测试是同步执行还是异步执行?

测试框架是否同步执行每一个测试,这意味着在任何时候只执行一个测试和测试套件?

还是测试框架在一个测试套件中一次只执行一个测试,但能够同时执行多个测试套件?

或者测试框架完全异步地同时运行所有测试和测试套件?

这很重要,因为它直接影响我们是否能够构建测试的方式,尤其是在测试的设置和拆除以及我们断言功能是否正常工作的方式方面。

谢谢!

标签: flutterunit-testingdartasynchronoustesting

解决方案


通常,dart test将并行执行许多测试(并行度级别因 CPU 核心数而异),但您可以使用命令行标志禁用它。

您不应该编写任何相互依赖的测试(即一个测试不应该依赖于另一个测试设置的某些全局状态)。例如,您可能会发现,由于您的笔记本电脑与 CI 服务器的 CPU 配置不同,您的测试可能会在本地通过,但由于排序不同而在 CI 中失败。

如果您有一些非常昂贵的设置逻辑,并且需要在多个测试之间重用,您可以使用setUpAll()在测试组中的每个测试之前运行一些代码,但是仍然不鼓励这样做。就个人而言,我更喜欢将测试加入一个长测试,以保持所有测试自包含。

这有一些优点。例如,您可以使用--total-shards--shard-index并行化 CI 中的测试(通过创建多个作业,每个作业运行测试套件的不同子集)。

您还可以使用 随机化测试的顺序--test-randomize-ordering-seed,以确保您不会意外地在测试之间设置这种可能导致其结果无效的依赖关系(即test2,如果它发生在 之后,可能只会通过test1,随机化排序会捕捉到这一点)。

TLDR

许多测试并行运行。尽量保持测试自包含,不依赖于测试的顺序。将设置逻辑提取到函数中并将其传递给setUp. 如果你真的需要性能,你可以尝试setUpAll但尽可能避免它。


推荐阅读