【发布时间】:2020-12-14 19:12:58
【问题描述】:
我想跟踪任意 Node.js 程序的执行路径。
具体来说,我想运行一个程序(服务器或脚本),并对执行进行某种块级(函数调用、循环、if 语句)跟踪。
约束
- 输出必须包含执行期间所有行的文件/行/命中计数
- 没有代码缩小。伊斯坦布尔很棒,但我想让最终执行的代码尽可能地可读。
- 对于长时间运行的进程(例如服务器),我希望能够查看“当前”行覆盖率(或尽可能最新)
- 我不想丢失任何覆盖率数据,因此虽然 Profiling 会给我一些关于行命中的提示,但这并不是真正的代码覆盖率。
我不关心的事情
- 究竟是如何读取覆盖范围的。例如,可以输出到文件,可以通过代码读取等。
- 覆盖格式
到目前为止我调查过的事情:
使用 NODE_V8_COVERAGE:
我发现如果我将NODE_V8_COVERAGE环境变量设置为一个目录,程序退出时覆盖率数据会输出到那个目录(这里有一个blog post关于这个特性的创建)。
我在这里面临的问题是,我不确定是否有办法在程序终止之前触发这些报告的生成。
使用检查器
我也一直在尝试使用 Node.js 检查器。我找到了一个有用的 CPU 分析器 here。这最终可能会有所帮助,但此分析器通过采样工作,而不是作为语言的挂钩。结果,我只获得了部分代码缓慢的行号/计数。
我也尝试使用Profiler.startPreciseCoverage,认为这可能会以某种方式给我执行的每一行(没有找到文档来明确它的实际作用)。好像没什么用了
使用伊斯坦布尔
如果可能,我想避免检测代码。
问题
我的选择似乎有限,但同时这只是我谷歌搜索一两个小时的结果。
有没有更好的方法来捕获上面列出的约束条件下的线路覆盖范围?
【问题讨论】:
-
我不确定是否完全理解您的要求,但您是否尝试过使用 ndb (github.com/GoogleChromeLabs/ndb) 运行您的脚本/服务器?您可以添加断点以在特定点停止执行并检查范围。但对你来说更重要的是:你可以记录性能,它会给你某种 FlameGraph。您还可以使用它来分析内存使用情况。它是 chrome devtools,但适用于 nodejs
-
精确覆盖 (
startPreciseCoverage) 和尽力覆盖之间的区别在 v8.dev/blog/javascript-code-coverage 中进行了介绍。 IIUC,精确覆盖对超出范围的功能进行计数,而尽力而为的覆盖会丢失该信息。 -
如果你必须在你的应用中添加一行代码来写出当前的覆盖率,那会满足你的需求吗?
-
@Trott 没关系!添加几行并不破坏交易
标签: node.js code-coverage