【问题标题】:Are Dart/Flutter tests executed synchronously or asynchronouslyDart/Flutter 测试是同步执行还是异步执行
【发布时间】:2021-12-07 00:05:48
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: flutter unit-testing dart asynchronous testing


    【解决方案1】:

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

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

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

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

    您还可以使用--test-randomize-ordering-seed 随机化您的测试顺序,以确保您不会意外地在测试之间设置这种可能导致其结果无效的依赖关系(即,也许test2 只有在它发生在@987654327 之后才会通过@,随机排序将捕获此问题)。

    TLDR

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

    【讨论】:

      猜你喜欢
      • 2020-04-14
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2012-02-05
      • 2018-10-11
      • 1970-01-01
      相关资源
      最近更新 更多