我们的团队负责包含法律规则的大型代码库。
代码库的工作原理如下:
class SNR_15_UNR extends Rule {
public double getValue(RuleContext context) {
double snr_15_ABK = context.getValue(SNR_15_ABK.class);
double UNR = context.getValue(GLOBAL_UNR.class);
if(UNR <= 0) // if UNR value would reduce snr, apply the reduction
return snr_15_ABK + UNR;
return snr_15_ABK;
}
}
调用context.getValue(Class<? extends Rule>)
时,它只评估特定规则并返回结果。这允许您在规则评估时创建依赖关系图,并且还可以检测循环依赖关系。
这样的约有500
个规则类。我们现在想要实现测试以验证这些规则的正确性。
我们的目标是按如下方式实施测试清单:
TEST org.project.rules.SNR_15_UNR
INPUT org.project.rules.SNR_15_ABK = 50
INPUT org.project.rules.UNR = 15
OUTPUT SHOULD BE 50
TEST org.project.rules.SNR_15_UNR
INPUT org.project.rules.SNR_15_ABK = 50
INPUT org.project.rules.UNR = -15
OUTPUT SHOULD BE 35
问题是:需要多少测试场景?是否可以使用静态代码分析来检测整个代码中存在多少个唯一代码路径?是否存在任何此类工具,或者我是否必须开始使用Eclipse JDT?
为了清晰起见:我不是在寻找代码覆盖率工具。这些告诉我哪些代码已执行,哪些代码不执行。我想估计实现单元测试所需的开发工作。
答案 0 :(得分:2)
(编辑2/25,专注于测试编码工作):
你有500个子类,每个子类出现(根据你的例子有一个条件)有2个案例。我猜你需要500 * 2次测试。
如果您的代码不是常规的,那么传统的(分支)代码覆盖工具可能不是您认为想要作为起点的答案,但它实际上可能有助于您进行估算。代码T&lt; 50在随机选择的类中进行测试,并且在您认为需要测试的代码库的任何部分(特别是您的类)上收集代码覆盖率数据P(作为百分比)。然后你需要大致(1-P)* 100 * T测试。
如果您的扩展类与您所暗示的一样正常,您可以考虑生成它们。如果您信任生成过程,则可以避免编写测试。
(原始回应,专注于路径覆盖工具)
大多数代码覆盖工具都是“线”或“分支”覆盖工具;他们不计算代码中的唯一路径。他们充其量只计算基本块。
路径覆盖工具确实存在;人们已将它们用于研究演示,但商业版本相对较少。您可以在http://testingfaqs.org/t-eval.html#TCATPATH找到一个。我不认为这个处理Java。
其中一个问题是,通过代码的明显路径通常是决策数量的指数,因为每个遇到的决策都会根据条件的结果(1个决策 - > 2个路径)生成True路径和False路径,2个决定 - &gt; 4个路径,......)。更糟糕的循环实际上是循环迭代重复多次的决定;一个重复100次的循环有2 ** 100个路径。为了控制这个问题,更有趣的路径覆盖工具尝试确定路径的可行性:如果来自该路径前缀中的条件的符号组合谓词实际上是错误的,则该路径是不可行的,可以忽略,因为它不会真正发生。另一个标准技巧是将循环视为0,1和N次迭代,以减少表观路径的数量。管理路径数量需要相当多的机器,远远超过大多数分支覆盖测试工具所需的机制,这有助于解释为什么真正的路径覆盖工具很少见。
答案 1 :(得分:-1)
需要多少测试场景?
很多。 500可能是一个好的开始。
是否可以使用静态代码分析来检测整个代码中存在多少个唯一代码路径?
是。它称为代码覆盖工具。这里有一些免费的。 http://www.java-sources.com/open-source/code-coverage