假设我有三种方法,都非常相似,但输入类型不同:
void printLargestNumber(int a, int b) { ... }
void printLargestNumber(double a, double b) { ... }
void printLargestNumber(String numberAsString, String numberAsString) { ... }
这三个都使用相同的底层逻辑。例如:可能double
版本是唯一一个比较数字的版本,而其他两个版本只是将其输入转换为double
。
我们可以想象一些不同的单元测试:第一个输入更大,第二个更大,两个输入都是负数等。
我的问题
所有三种方法都应该有完整的测试集(黑盒子,因为我们不认为核心实现是相同的)
或
只应对double
版本进行大量测试,并对其他两个版本进行轻微测试以验证参数转换(白盒测试,因为我们知道它们共享相同的实现并且已经在double
测试中进行了测试)?
答案 0 :(得分:2)
如果所有这些方法都是公开的,即外部世界可以调用,我肯定会用全套测试来测试所有这些方法。一个很好的理由是白盒测试比黑盒测试更脆弱;如果实施发生变化,公共合同可能会因某些方法而发生变化。
答案 1 :(得分:2)
取决于。
您认为实施可能会改变吗?如果是这样,那么请进行黑盒测试。
如果可以保证实施不会改变,请使用白框。但是,您能够保证这一点的可能性不是100%。
您可以妥协并进行一些黑盒测试,尤其是在边界条件下。但是,编写测试应该很容易 - 因此,不进行全黑盒测试的观点没有任何借口。唯一的限制因素是运行测试所需的时间。
也许您应该研究并行运行测试的可能性。
答案 2 :(得分:2)
有一组测试明确地运用公共接口。我会把它们视为黑盒测试。
可以看到第二组测试可以看作实施的角落情况。这是白盒测试,肯定在单元测试中占有一席之地。如果没有一些白盒实现知识,你无法知道有趣的路径。我会特别注意String的情况,因为接口允许可能无法完全转换为双精度的字符串,这会推动精度等边界。
我会在整数情况下切几个角吗?我知道我在双重情况下推动了路径,可能不应该,但可能会在时间压力下。