假设您有3个函数,functionA,functionB和functionC
functionC依赖于functionA和functionB
git stash
现在这显然是一个超级简化的例子..但是测试functionC的正确方法是什么?如果我已经测试了functionA和functionB并且他们通过了不会测试functionC结束不仅仅是一个单元测试,因为它依赖于functionA和functionB返回..
答案 0 :(得分:5)
对于前两个功能,您将专注于他们的公共合同 - 您将根据需要编写尽可能多的测试,以确保不同情况的所有结果都符合预期。
但是对于第三个函数,理解函数应该调用其他两个函数可能就足够了。所以你可能需要更少的测试。您不需要再次测试测试A和B所需的所有情况。您只需要验证C负责的预期“管道”。
答案 1 :(得分:4)
在我看来,你的测试应该不知道,functionC正在使用functionA和functionB。通常,您会创建自动测试,以支持更改(代码维护)。如果更改C的实现怎么办? functionC的所有测试也变得无效,这是不必要和危险的,因为这意味着,重构者也必须理解所有测试。即使他/她确信,他/她没有改变合同。如果你有一个很好的测试覆盖,他/她为什么要这样做?因此,功能C的公共合同将被全面测试!
还有一个进一步危险,如果测试对sut(functionC)的内部工作原理了解太多,他们往往会重新实现内部的代码。因此执行实现的相同(可能是错误的)代码检查实现是否正确。 举个例子:你将如何实现functionC的(whitebox)测试。模拟functionA和functionB,看看是否产生了模拟结果的总和。这对于测试覆盖率(kpi ??)来说是好的,但也可能具有误导性。
但是,测试functionA和functionB的功能两次的高强度额外努力呢?如果是这样,则可能很容易重用测试代码,如果无法重用,我认为这更能证实我之前的陈述。