Unit testing 单元测试应该是黑盒测试还是白盒测试?

Unit testing 单元测试应该是黑盒测试还是白盒测试?,unit-testing,black-box,white-box,white-box-testing,black-box-testing,Unit Testing,Black Box,White Box,White Box Testing,Black Box Testing,假设我有三种方法,都非常相似,但输入类型不同: void printLargestNumber(int a, int b) { ... } void printLargestNumber(double a, double b) { ... } void printLargestNumber(String numberAsString, String numberAsString) { ... } 这三种方法都使用相同的基本逻辑。例如:double版本可能是唯一比较数字的版本,而另外两个版本只是

假设我有三种方法,都非常相似,但输入类型不同:

void printLargestNumber(int a, int b) { ... }
void printLargestNumber(double a, double b) { ... }
void printLargestNumber(String numberAsString, String numberAsString) { ... }
这三种方法都使用相同的基本逻辑。例如:
double
版本可能是唯一比较数字的版本,而另外两个版本只是将其输入转换为
double

我们可以想象几个不同的单元测试:第一个输入更大,第二个更大,两个输入都是负数,等等

我的问题

这三种方法是否都应该有完整的测试集(黑匣子,因为我们不假设核心实现是相同的)


只有
double
版本需要进行大量测试,而另外两个版本需要进行少量测试以验证参数转换(白盒测试,因为我们知道它们共享相同的实现,并且已经在
double
测试中进行了测试)

如果所有这些方法都是公共的,即可由外部世界调用,我肯定会用一整套测试来测试它们。一个很好的理由是,白盒测试比黑盒测试更脆弱;如果实现发生了变化,那么其中一些方法的公共契约可能会发生变化。

如果所有这些方法都是公共的,也就是说,可以被外部世界调用,我肯定会用一整套测试来测试所有这些方法。一个很好的理由是,白盒测试比黑盒测试更脆弱;如果实施发生变化,公共合同可能会因某些方法而发生变化。

这取决于具体情况

您认为实施可能会改变吗?如果是这样,那么就进行黑盒测试

如果可以保证实现不会更改,请使用白框。然而,你能够保证这一点的几率并不是100%

您可以妥协并进行一些黑盒测试,特别是在边界条件附近。然而,编写测试应该很容易——因此从这个角度来看,没有理由不进行完整的黑盒测试。唯一的限制因素是运行测试所需的时间

也许您应该调查并行运行测试的可能性。

这取决于具体情况

您认为实施可能会改变吗?如果是这样,那么就进行黑盒测试

如果可以保证实现不会更改,请使用白框。然而,你能够保证这一点的几率并不是100%

您可以妥协并进行一些黑盒测试,特别是在边界条件附近。然而,编写测试应该很容易——因此从这个角度来看,没有理由不进行完整的黑盒测试。唯一的限制因素是运行测试所需的时间


也许您应该研究并行运行测试的可能性。

有一组测试显式地执行公共接口。我会将这些视为黑盒测试

还有第二组测试可以看作是查看实现的关键案例。这是白盒测试,在单元测试中肯定有一席之地。如果没有一些白盒实现知识,就无法知道有趣的路径。我会特别注意字符串的情况,因为接口允许字符串不能干净地转换为双精度,从而推高了精度的边界等


在整数的情况下,我会省事吗?我知道我在双重情况下推动了路径,可能不应该,但可能在时间压力下

有一组测试显式地执行公共接口。我会将这些视为黑盒测试

还有第二组测试可以看作是查看实现的关键案例。这是白盒测试,在单元测试中肯定有一席之地。如果没有一些白盒实现知识,就无法知道有趣的路径。我会特别注意字符串的情况,因为接口允许字符串不能干净地转换为双精度,从而推高了精度的边界等


在整数的情况下,我会省事吗?我知道我在双重情况下推动了路径,可能不应该,但可能在时间压力下

+1表示“编写测试应该很容易”。诚然,它们都非常相似且易于编写,如果实现发生了变化(这就是测试的目的!),这会有所帮助。谢谢你的回答!您不能保证实现永远不会改变。不是50%,不是20%,不是1%。你就是不能。一切都可能在某个时刻发生变化。如果您只测试代码的一部分,“因为我知道这实际上是它的别名”,那么,当它发生变化时(不是如果,当),您突然(没有立即意识到)停止测试代码的一部分。不好的。总是假设一切都可以,而且大部分都会在某个时刻发生变化。相应地进行测试。+1表示“编写测试应该很容易”。诚然,它们都非常相似且易于编写,如果实现发生了变化(这就是测试的目的!),这会有所帮助。谢谢你的回答!您不能保证实现永远不会改变。不是50%,不是20%,不是1%。你就是不能。一切都可能在某个时刻发生变化。如果您只测试代码的一部分,“因为我知道这实际上是它的别名”,那么,当它发生变化时(不是如果,当),您突然(没有立即意识到)停止测试代码的一部分。不好的。总是假设一切都可以,而且大部分都会在某个时刻发生变化。相应地测试。人力资源管理…这可能是人力资源管理的一个副本…这可能是一个副本