让我们假设以下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)
发现了一个错误。该错误位于某些基础类中,仅适用于expression
和data
的某些特殊组合。对于这种特殊情况,可以轻松编写JUnit测试,并且可以修复。
不幸的是,这个方法在整个项目中经常使用。 Eclipse调用层次结构标识了使用此方法的97种以上其他方法。我现在担心回归,如果我只是应用错误修正。为了感觉更安全,我想做一些回归测试。
通常,单元测试应考虑所有重要类型的调用,尤其是边界情况。但是,由于expression
是一个可以变化很大的DSL,因此测试覆盖所有潜在用途并不容易。此外,这些测试不会识别依赖于错误的错误使用。
所以我的想法是按照以下方式进行:
查找此方法的所有调用(例如在Eclipse中使用“调用层次结构”)并提取expression
的所有值。
为data
(例如来自数据库)抽取足够的实际值,并使用MyClass.methodA(String,String)
的原始版本交叉评估第一步中的所有表达式。将三元组(data, expression, result)
保存到文件中。
实施错误修正。
使用上述文件测试方法MyClass.methodA(String,String)
断言结果未发生变化。
以下问题:
您如何看待这种方法?
在Eclipse中使用调用层次结构我只能复制和粘贴调用方法,但不能复制和粘贴包括剪贴板参数的确切调用(参见步骤1)。对于找到的每个方法,我都必须手动复制调用调用。如何以方便的方式提取调用(在完整的Eclipse工作区中,因此在几个项目中)?
恕我直言,我只测试一种方法,因此测试仅涵盖一个单元。可以在步骤4中使用JUnit还是有更复杂的东西?
答案 0 :(得分:0)
由于测试软件的预期附加值是为了涵盖最低成本和最大结果的大多数情况,我同意您的方法。
从您的软件中收集reallife samplevalues并将它们保存到代表性文件中应该不会那么复杂,在我看来这是分析这个东西的最佳方式。即使你必须手动复制它。