【问题标题】:Estimate unit tests required in large code base估计大型代码库中所需的单元测试
【发布时间】:2012-02-23 15:52:44
【问题描述】:

我们的团队负责一个包含法律规则的大型代码库。

代码库主要是这样工作的:

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&lt;? extends Rule&gt;) 被调用时,它只是评估特定规则并返回结果。这允许您在评估规则时创建依赖关系图,还可以检测循环依赖关系。

大约有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?

为了清楚起见:我不是在寻找代码覆盖工具。这些告诉我哪些代码已执行,哪些代码未执行。我想估计实现单元测试所需的开发工作量。

【问题讨论】:

  • 应该是Double,也可能是null,还是你的意思是double
  • 对于测试框架,根据您的示例,虽然我从未使用过,但这可能很有用:fitnesse.org/FitNesse.UserGuide.TwoMinuteExample
  • @PeterLawrey 并不重要,但我更改了它以避免混淆。
  • 在overscheme中性能差异并不大,但恕我直言。
  • 鉴于测试用例的数量可能会变得非常大,您可能需要考虑成对测试。有一个名为 PICT 的非常方便的工具,它将根据您使用 DSL 定义的规则生成成对的测试用例。以下是对 PICT 的全面介绍:msdn.microsoft.com/en-us/library/cc150619.aspx

标签: java unit-testing static-analysis estimation


【解决方案1】:

(编辑 2/25,专注于测试编码工作):

您有 500 个子类,每个子类(根据您的示例和一个条件)出现 2 个案例。我猜你需要 500*2 次测试。

如果您的代码不是您所暗示的常规代码,则常规(分支)代码覆盖工具可能不是您认为想要作为起点的答案,但它实际上可能会帮助您做出估计。对随机选择的类进行代码 T

如果您的扩展类都像您暗示的那样常规,您可以考虑生成它们。如果您信任生成过程,则可以避免编写测试。

(原始回复,专注于路径覆盖工具)

大多数代码覆盖工具是“行”或“分支”覆盖工具;他们不计算通过代码的唯一路径。充其量他们只计算基本块。

确实存在路径覆盖工具;人们为研究演示构建了它们,但商业版本相对较少。您可以在http://testingfaqs.org/t-eval.html#TCATPATH 找到一个。我不认为这个处理 Java。

其中一个问题是,通过代码的明显路径通常在决策数量上呈指数增长,因为每个遇到的决策都会根据条件(1 个决策 --> 2 个路径, 2个决定-> 4条路径,...)。更糟糕的循环实际上是一个循环重复多次的决策。重复 100 次的循环实际上有 2**100 条路径。为了控制这个问题,更有趣的路径覆盖工具尝试确定路径的可行性:如果来自该路径前缀中的条件的符号组合谓词实际上是错误的,则该路径是不可行的并且可以忽略,因为它不可能真正发生。另一个标准技巧是将循环视为 0、1 和 N 次迭代,以减少明显路径的数量。管理路径数量需要相当多的机器,远远超过大多数分支覆盖测试工具所需的,这有助于解释为什么真正的路径覆盖工具很少见。

【讨论】:

    【解决方案2】:

    需要多少个测试场景?

    很多。 500 可能是一个好的开始。

    是否可以使用静态代码分析来检测整个代码中存在多少唯一代码路径?

    是的。它称为代码覆盖工具。这里有一些免费的。 http://www.java-sources.com/open-source/code-coverage

    【讨论】:

    • 不是特定路径覆盖工具的代码覆盖工具不计算通过代码的唯一路径。他们最多算基本块。
    • 计算唯一路径非常昂贵且难以可视化。我想我并没有从字面上理解这一点,因为我无法想象这是有用的。 (鉴于我不知道任何此类工具,我可能并不孤单;)
    • 现在你做:testingfaqs.org/t-eval.html#TCATPATH(我与这个工具无关,也没有使用它。关键是它们作为商业工具存在)。
    • @IraBaxter 请将此添加为答案,以便我可以奖励您积分甚至赏金:-)
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多