单位测试应该是黑匣子测试或白盒测试吗?
-
29-09-2019 - |
题
假设我有三种方法,都非常相似,但是具有不同的输入类型:
void printLargestNumber(int a, int b) { ... }
void printLargestNumber(double a, double b) { ... }
void printLargestNumber(String numberAsString, String numberAsString) { ... }
这三个都使用相同的基础逻辑。例如:也许 double
版本是唯一比较数字的版本,其他两个只是将其输入转换为 double
.
我们可以想象一些不同的单位测试:第一个输入更大,第二个输入更大,两个输入都是负数,等等。
我的问题
如果所有三种方法都具有完整的测试(黑匣子,因为我们不认为核心实现是相同的)
或者
应该只有 double
对版本进行大量测试,另外两个测试对参数转换进行了验证(白盒测试,因为我们知道它们共享相同的实现,并且已经在 double
测试)?
解决方案
如果所有这些方法都是公开的,即外界可召唤,我肯定会通过全套测试进行测试。一个很好的理由是,白盒测试比黑盒测试更易碎。如果实施改变,则公共合同可能会改变其中一些方法。
其他提示
这取决于。
您认为实施可能会改变吗?如果是这样,请进行黑匣子测试。
如果您可以保证实现不会改变白框。但是,您能够保证这不是100%的机会。
您可以妥协并进行一些黑匣子测试,尤其是在边界条件周围。但是,编写测试应该很容易 - 因此,从这个角度来看,没有任何借口 不是 进行全黑框测试。唯一的限制因素是运行测试所需的时间。
也许您应该研究并行运行测试的可能性。
有一组明确行使公共接口的测试。我将这些视为黑盒测试。
有第二组测试可以看作查看实施的角案例。这是白盒测试,肯定在单位测试中占有一席之地。没有一些白色框实现知识,您将无法知道有趣的路径。我会特别注意弦盒,因为该接口允许无法干净地转换为双打的字符串,从而突破精度等的边界。
我会在整数案例中砍掉一些角落吗?我知道我在双重案件中推了道路,可能不应该在时间压力下。
不隶属于 StackOverflow