我怎样才能更快地找出哪个节点单元导致异步错误?

How can I figure out which nodeunit is causing async errors more quickly?

我 运行 在测试相当大的重构时遇到了问题(在这种情况下,将旧服务从 node.js 0.12 移动到 10.x)。我们使用 g运行t 所以我从 grunt nodeunit:all:

中得到了以下结果
...
verify-api.routes.test.js
test setValues (pass)
Fatal error: Cannot read property 'setUp' of undefined

一些谷歌搜索导致几个线程 - this one 是一个很好的概要 - 正确显示此错误是在 test.done 被多次调用时。

太棒了!没问题。有了它,您现在可以根据输出深入 verify-api.routes.test.js 并 see/assume 找出问题所在。只是——你错了。事实证明,错误(在我的例子中)位于完整测试套件 运行 中的两个测试套件 before verify-api.routes.test.js。公平地说,这部分是 g运行t 的错误,因为输出误导我们识别 verify-api.routes.test.js... 但如底部所示,其他方式只是让 nodeunit 更清楚不知道问题出在哪里 - 这只是稍微好一点。

我发现我 运行 可能偶尔会遇到这样的问题 - 但当它发生时它会很痛苦......像这样的情况特别痛苦,因为它们通常只是偶尔出现 -例如在发布时或看似良性的合并后。

是否有人们正在使用的快速技巧来发现这些问题或使他们的代码对这些类型的问题更具弹性?


如前所述,一些 nodeunit 运行ners 提供了不同的结果...more/less 误导取决于上下文:

直接使用 运行ning nodeunit 时,我得到以下输出:nodeunit tests/**/*.test.js

OK: 162 assertions (2720ms)

FAILURES: Undone tests (or their setups/teardowns): 
- test setValues

这通过 Intellij 的 IDEA 很好地为我们提供了更多信息:

./node_modules/nodeunit/lib/core.js:285
    if (group.setUp) {
              ^
TypeError: Cannot read property 'setUp' of undefined
    at wrapGroup (./node_modules/nodeunit/lib/core.js:285:15)
    at Object.exports.runSuite (./node_modules/nodeunit/lib/core.js:93:13)

所以 - 我正在寻找有助于解决此 class 问题的最佳实践。在 self-defense 以及接下来的内容中,我将提及一些我认为重要的事情,然后花一些时间讨论今天对我有帮助的策略...

1。持续集成

运行尽可能频繁地进行测试可以更准确地向您显示导致问题的更改。当你有很多测试或一些长时间的 运行ning 测试时,你可能会发现你不能 运行 全部(如上所述),而是重构重要的测试以使它们更快。 运行按区域进行测试也有帮助。

2。同行评审/结对编码

通常有助于在问题发生时发现问题,或者在问题发生后不久在调试和维护方面节省调试时间,以换取更多的前期时间。

3。使用 async

如果你是异步编程,你真的应该看看这个库来让你的代码更简洁。 Async 还有近乎神奇的组件,可以处理异步依赖管理、过滤等。如果您正在开发节点代码,请立即获取 (async)[https://github.com/caolan/async]


最后但同样重要的是...今天对我帮助最大的是 运行使用 find:

进行隔离测试

4。 运行 使用 find

进行隔离测试

今天对我帮助最大的是 运行 使用 'find' 进行隔离测试。在此之前,我们可能会将测试分成几组以尝试缩小搜索范围 space - 二分搜索样式 - 直到我们找到有用的东西。

我在包脚本中创建了一个规则来为我做这件事——用一些回声来更清楚哪些输出属于哪些测试:

"find-run-all-tests": "time find . -not -path \"./node_modules/*\" -type f -name \"*.test.js\" -exec echo \n----------- Testing : {} --------------- \; -exec node_modules/nodeunit/bin/nodeunit {} \; -exec echo ----------- Finished : {} --------------- \; ",

这当然允许我们从项目中npm run find-run-all-tests。这样做的好处是 a) 它 运行 是项目指定的 nodeunit 版本,b) 向我们展示了整个套件花费了多少时间 运行 c) 创建的输出清楚地暗示了哪个suite 是问题所在,d) 运行s 每次测试都在完全隔离的情况下每次重新启动节点(这里的性能损失很大):

tokenoftrust-routes.test.js

✔ test login with basic privileges works.
✔ non-privileged access of privileged page. - when user is not logged in they should be directed to log-in
✖ non-privileged access of privileged page. - when user is logged in they should get an error page

FAILURES: Undone tests (or their setups/teardowns): 
- non-privileged access of privileged page. - when a non-test user is logged in they should STILL be able to see Developer Home

To fix this, make sure all tests call test.done()

----------- Testing : ./website/tests/apiKeysInvite-routes.test.js ---------------
----------- Testing : ./tests/services/requestService.test.js ---------------

requestService.test.js
✔ request service - expire request works.
✔ request service basic CRUD operations on objects work.
✔ request service basic CRUD operations on simple types.

OK: 15 assertions (834ms)
----------- Finished : ./tests/services/requestService.test.js ---------------

再一次 - 我没有看到我们 运行一直这样做,因为性能成本。在我们的案例中,测试时间比 运行 长了 5 倍,但只花费了 4 分钟的微小成本,它帮助我隔离了我们隔离了大量测试套件中的一系列问题,从而使我们能够跳过一些适得其反的侦查我们发现自己在做的工作。


这是一个奇怪的案例,我们在进行了一些非常广泛的更改后被迫走这条路,但我想知道其他人 have/do 是否经历过这种痛苦,如果是的话,你们正在做什么来缓解 pain/problem。如果我遗漏了一些明显的东西,或者如果您正在使用可以节省您大量时间的 hack,请分享。

随着我们进行更多测试,我发现这变得越来越频繁和昂贵,因此我们需要变得更好更快。