让我们假设以下 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 还是有更复杂的东西?