【发布时间】:2013-09-03 23:55:13
【问题描述】:
作为 NodeJS REST API 的自定义测试框架的一部分,我想通过将所有可能结果与测试套件收到的结果进行比较,自动检测我的测试何时不再提供适当的覆盖率.
有哪些方法可以做到这一点?我们可以假设它被用于具有需要覆盖分析的入口函数(API 端点)列表的 REST API,并且每个入口函数将以一个已知的“退出函数”结束,该函数以标准方式响应请求者。
这是我目前发现的:
1:基本解决方案(目前已实施)
- 在编写每个 REST 端点时,手动创建所有可能结果“代码”[Success, FailureDueToX, FailureDueToY] 的列表,例如
- 测试运行后,确保列表中的每个代码都已被每个端点的测试套件看到。
优点:非常基本且易于使用;不会改变性能测试时间
缺点: 人工检查非常容易出错;如果有 5 种“FailDueToX”方法并且您只测试其中一种,则不会标记任何问题。 “覆盖”的非常基本的定义
2:静态分析
- 将代码解析为某种解析树并查找“退出函数”的所有实例
- 向上遍历树,直到到达 API 端点,然后将该退出实例作为预期输出添加到端点(需要保留堆栈跟踪记录以通过哈希或类似方式到达那里)
- 运行测试时,端点返回堆栈跟踪哈希或类似信息,并将其与预期的输出列表进行比较。
优点:自动;捕获可能产生相同输出代码的不同分支
缺点: 生成解析树并非易事;不检测永远不会运行的死代码;测试套件需要保持同步
3:分析
我过去曾在嵌入式系统上使用 GreenHills Code Coverage Tools 完成此操作
- 启动像 dtrace 这样的分析器并分别记录每个测试的堆栈日志
- 解析堆栈日志并将“测试”分配给每一行代码
- 手动分析带注释的代码以找出差距。
优点: 半自动;向开发人员提供有关总覆盖率的更多信息;可以看到
缺点:减慢测试速度;无法并行进行性能测试;当可能的结果永远不会发生时不会标记。
还有哪些工具可以帮助我实现静态分析和概要分析目标?
【问题讨论】:
标签: node.js rest testing code-coverage