测试始终返回True的函数

时间:2011-05-11 16:52:50

标签: tdd

如何为以下函数编写测试?

bool IsAnInterger(int ignore) 
{
    return true
}

我没有足够的时间迭代每个整数(对于实际代码,参数甚至不是整数)。

这用作规范模式的一部分,因此我可以实现一个空对象。

3 个答案:

答案 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中,您只需编写足够的代码,以便您的单元测试通过。你完成了这件事,可以继续前进。