如何为以下函数编写测试?
bool IsAnInterger(int ignore)
{
return true
}
我没有足够的时间迭代每个整数(对于实际代码,参数甚至不是整数)。
这用作规范模式的一部分,因此我可以实现一个空对象。
答案 0 :(得分:6)
...测试可以是一种非常有效的方式来显示错误的存在,但它显然不足以显示它们的缺席。
- Edsger W. Dijkstra
我会说尝试对此功能进行详尽的黑盒测试是没有意义的。最好在类似于使用它的环境中进行测试。
答案 1 :(得分:2)
在TDD中,您首先编写测试,该测试应指定特定行为。所以问题应该总是:我期待发生什么? - 然后编写测试以验证该行为 - 最后编写解决方案以使测试通过。
修改:了解问题
您的意思是此功能是不存在的规范的行为,例如一个Null规范?您当然可以以某种方式测试它的行为。但是,在猜测中,这几乎是硬编码的单行返回值(如果有的话)。然后,对这个null对象的测试基本上只记录null规范应该做什么。它不会向系统添加任何其他额外的业务价值。
答案 2 :(得分:0)
由于您无法合理地测试每个案例,因此您可以使用Mathematical Induction 作为测试的基础。您无法以代数方式执行此操作,但可以为 n
选择任意值。
#include <limits>
#include <cassert>
bool IsAnInteger(int)
{
return true;
}
int main()
{
assert(IsAnInteger(std::numeric_limits<int>::min())); // First
assert(IsAnInteger(0)); // n
assert(IsAnInteger(1)); // n+1
}
等一下!
对于实际代码,参数甚至不是整数
那是什么?
#include <cassert>
template <class T>
bool IsAnInteger(const T&)
{
return true;
}
int main()
{
assert(IsAnInteger(0)); // First
assert(IsAnInteger("I am not a number!")); // n
assert(IsAnInteger(42.0f)); // n+x
}
您的功能具有100%的测试覆盖率,您的单元测试可准确记录其行为方式。在TDD中,您只需编写足够的代码,以便您的单元测试通过。你完成了这件事,可以继续前进。