It is a common recommendation, that Mocha test cases should not share state. In light of Mochas strongly sequential nature of execution of test cases, I really do not understand this recommentation. And more - I see it dubious.
If the test cases, even asynchronic ones, are executed strictly one after another, there is no risk of time-race problems or other unpredicted execution sequence.
Let's take this Mocha structure:
describe
describe
it1
it2 // async
it3
describe
it4
it5
describe
describe
it6 // async
it7 // async
it8
describe
it9
it10
Run Code Online (Sandbox Code Playgroud)
Test cases will ALWAYS be executed in clear sequential order, it1, it2,... it10, independently on whether they are sync or async, independently even on hierarchy of describes. The following structure will produce perfectly the same output:
describe
it1
it2 // async
it3
it4
it5
it6 // async
it7 // async
it8
it9
it10
Run Code Online (Sandbox Code Playgroud)
Shared data between test cases in a single describe() can make it much easier and comfortable to communicate between test cases in order to:
另一个支持在测试用例之间使用共享数据的事实是 Mocha 代码的这种简单而漂亮的结构。不同级别的 describe() 允许对该最终共享数据进行简单明了的范围管理。
我看到的唯一不利的一面是,当“全局变量”被“滥用”时,会使代码更难理解、遵循和维护。无论如何,没有什么是纪律性编码无法避免的。
有什么我不知道的吗?
它可以用摩卡运行不属于无状态的,因此互相依赖的测试。这不是 Mocha 的设计目的。归根结底,如果您想在测试之间强加依赖关系,当然可以。不过,它有一些警告。
您引用了在测试之间共享状态的优势:
减少测试执行时间
当然。在其他条件相同的情况下,我们宁愿拥有一个运行时间更短的测试套件。在运行整个套件时,在测试之间不重置状态可能相当于在大型测试套件上节省了相当多的时间。然而,事实是“所有其他”并不相等:
运行整个套件应该由一个自动化的过程来完成,该过程报告什么通过了什么失败了。换句话说,应该没有人坐在那里等待整个套房完成。
当出现故障或正在实施新测试时,开发人员将只想运行失败的测试或新测试,而不是整个套件。如果套件的设计使得测试 1 到 N-1 必须在测试 N 运行之前运行,那么这就是开发人员等待获得他真正关心的测试结果的更多时间。所以他可以坐在那里以每分钟 X 美元的速度转动他的拇指。“多任务”不是答案,因为已经证明切换任务存在认知成本。(“好的,测试完成了……等等,又是什么问题?”)
您可以使用--grep来选择特定的测试。这对于大型测试套件非常有用,可以避免浪费时间运行您不关心的测试。因此,让我们假设您的测试标题是it1, ...it10并且您使用--grep it7. 由于 Mocha 将所有测试视为相互独立,因此它只会运行适用于的任何内容before和beforeEach挂钩it7并运行测试(然后运行适用于它的任何内容after和afterEach挂钩)。它不会运行it1到it6运行前it7。为了让它运行这些测试,您必须制作一个--grep涵盖所有必要测试的方法,这当然总是可以做到但并不令人愉快。
在浏览器中运行 Mocha 时获得的 HTML 界面中,如果您希望 Mocha 只运行该测试,则可以单击该测试。同样,如果您要修复单个失败的测试,这将非常有用。如果碰巧失败的测试依赖于应该在它之前运行的一堆测试,那么就没有与这种简单的单击等效的东西。
通常,如果您的测试必须按特定顺序运行,则必须小心确保拆分到多个文件中的测试将按照测试运行所需的顺序加载。
例如,可以使用全局结构在存储在不同文件中的测试之间共享状态。但是,当测试在不同的文件中(其中一个文件不在 另一个文件中require)时,Mocha 处理文件的顺序完全取决于读取包含文件的目录时文件系统列出文件的顺序。--sort对于那些想要基于字典排序的可预测顺序的人,有一个选项。如果你想强加给自己的任意顺序,那么我想你必须命名您的文件01foo.js,02bar.js等等。
无论是使用 Node.js 运行 Mocha 还是在浏览器中运行 Mocha,都是如此。我有使用 RequireJS 加载测试文件的套件。请求模块 A、B、C 不能保证它们会按照 A、B、C 的顺序加载,除非声明 C 依赖于 B(可能还有 A)并且 B 依赖于 A。
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |