让我们假设以下Java类:

class MyClass {
   public String methodA( String data, String expression ) {
      // expression is evaluated using data
      // ...
      // this leads to a result which is returned
      return result;
   }
}

请注意, expression 是表达式语言(DSL)的实例。因此,评估 expression 使用 data 取决于两者的组合。通常情况下, expression 是一个不经常变化的固定值, data 可以在所有调用中改变。

好吧,稍后在 MyClass.methodA(String,String).该bug驻留在一些底层类中,只发生在以下的一些特殊组合中 expressiondata.JUnit测试很容易为这种特殊情况编写,并且可以修复。

不幸的是,这种方法在整个项目中经常使用。Eclipse调用层次结构标识了使用此方法的97个以上的其他方法。我现在害怕回归,如果我只是应用修复程序。为了感觉更安全,我想做一些回归测试。

通常,单元测试应考虑所有重要类型的调用,特别是边界情况。但是,作为 expression 是一个可以变化很大的DSL,它不容易测试-涵盖所有潜在的用法。此外,这些测试不会根据错误识别错误使用。

所以我的想法是按照以下方式进行:

  1. 查找此方法的所有调用(如在Eclipse中使用"Call hierarchy")并提取所有值 expression.

  2. 采样足够的真实值 data (例如从数据库)和交叉评估所有表达式从它的第一步使用原始版本 MyClass.methodA(String,String).保存三元组 (data, expression, result) 到一个文件。

  3. 实现bugfix。

  4. 测试方法 MyClass.methodA(String,String) 使用上面的文件断言结果没有改变。

以下问题:

您如何看待这种方法?

在Eclipse中使用调用层次结构,我只能复制和粘贴调用方法,但不能复制和粘贴确切的调用,包括到剪贴板的参数。步骤1)。我将不得不为找到的每个方法手工复制调用调用。如何以方便的方式提取调用(在完整的Eclipse工作区中,因此在几个项目中)?

恕我直言,我只测试一个单一的方法,因此测试只涵盖一个单元。使用JUnit进行步骤4是否可以,还是有更复杂的东西?

有帮助吗?

解决方案

由于测试您的软件的预期附加价值是以最低的成本和最大的结果复盖大多数情况,我同意您的方法。

从您的软件中收集reallife samplevalues并将其保存到代表性文件不应该那么复杂,并且在我看来是分析这件事的最佳方式。即使你必须手动复制它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top