[英]should unit tests be black box tests or white box tests?
说我有三种方法,所有方法都非常相似,但输入类型不同:
void printLargestNumber(int a, int b) { ... }
void printLargestNumber(double a, double b) { ... }
void printLargestNumber(String numberAsString, String numberAsString) { ... }
这三个都使用相同的基础逻辑。 例如: double
版本可能是唯一一个比较数字的版本,而另外两个版本只是将其输入转换为double
。
我们可以想象一些不同的单元测试:第一个输入较大,第二个较大,两个输入均为负,等等。
我的问题
所有这三种方法都应该具有完整的测试集(黑框,因为我们不假定核心实现是相同的)
要么
应该只对double
版本进行大量测试,而对另外两个版本进行轻松测试以验证参数转换(白盒测试,因为我们知道它们共享相同的实现,并且已经在double
测试中进行了测试)?
如果所有这些方法都是公开的,即可以被外界调用,那么我肯定会用一整套测试来测试它们。 一个很好的理由是白盒测试比黑盒测试更易碎。 如果实施方式发生变化,则公共合同可能会针对某些方法而发生变化。
这取决于。
您是否认为实施方式可能会发生变化? 如果是这样,那就进行黑盒测试。
如果可以保证实现不会改变,请使用白框。 但是,您能够保证这一点的可能性不是100%。
您可能会妥协并做一些黑盒测试,尤其是在边界条件附近。 但是,编写测试应该很容易-因此从这个角度出发,没有理由不进行完整的黑盒测试。 唯一的限制因素是运行测试所花费的时间。
也许您应该研究并行运行测试的可能性。
有一组测试明确地使用了公共接口。 我会将其视为黑盒测试。
还有第二组测试可以看作是查看实施的极端情况。 这是白盒测试,并且肯定在单元测试中占有一席之地。 没有一些白盒实现知识,您就无法知道有趣的路径。 我会特别注意String的情况,因为接口允许的字符串可能无法干净地转换为double值,从而超出了精度范围。
我会在整数情况下偷工减料吗? 我知道我在双重情况下走了一条路,也许不应该,但是在时间压力下可能会很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.