对不返回任何值的函数进行单元测试

时间:2015-08-28 09:42:51

标签: c++ unit-testing

我正在使用cppunit在c ++中进行单元测试。我已经在互联网上看到一些示例,它们正在测试一个返回某些值的函数。我的项目中有一些函数不会返回任何值,但会在里面进行一些计算。在这里,我想测试这些函数内部的计算,无论计算是否正确完成,我该怎么办?例如,我有一个功能

void Flash::SerializeToBytes(Buffer &buffer) const
{
    // calculations
} 

2 个答案:

答案 0 :(得分:2)

这些自动测试的一般概念总是相同的:你知道,给定一定的输入,一个函数应该产生一定的结果。将实际结果与您期望的结果进行比较。如果它们相同,则通过测试,否则您的代码或测试中会出现错误。

那就是说,让我们试着将它应用到你的具体案例中。您通过引用传递buffer,以便您可以修改它(否则它应该是一个const引用!)。因此,您必须编写调用函数的测试,然后检查buffer发生了什么,而不是检查返回的值。从概念上讲,它是相同的:您提供一些输入并将输出与预期输出进行比较。只是在这种情况下,输出不是返回值,而是用作输入的相同对象。

如果这是不可能的,例如因为参数是通过const引用或值传递的,您必须了解您的函数如何与世界其他地方交互。如果它没有返回,抛出,修改其中一个输入参数等,那么它不适合这些测试。这可能意味着两件事:它是一个你不关心测试的函数(至少以这种方式),或者你必须重构你的代码。

前者的一个例子是与硬件交互的东西。假设您正在为带有LED的嵌入式系统编写代码,并且您具有打开或关闭LED的功能。这不是一个适合自动测试的情况。只需跳过它,您就不需要通过自动测试覆盖100%的代码(参见this great answer)。

另一方面,由于全局变量,您的函数可能会与世界其他地方进行交互,而您的程序会大量使用(糟糕的想法)。那么在这种情况下你可以仍然编写一些测试(只需检查调用函数后全局变量会发生什么),但 应该做的是重构你的代码所以你的函数接收它需要的所有变量作为参数,并且在你为所有函数完成它之后,你可以将全局变量更改为非全局变量,并且最终得到返回值的函数和/或修改作为引用或指针传递的参数,为此编写测试很容易。

简而言之:如果你有一个你不知道如何测试的功能,那么可能要么为它编写测试是不值得的,或者它是你的代码可能需要进行一些更改的指示。 / p>

答案 1 :(得分:0)

如果某个功能没有返回,它仍然可能有副作用。例如,对象的状态发生变化(例如成员变量/字段)。在您的情况下,可能会修改通过引用(Buffer)传递的参数。你可以对此进行测试。

通常,您需要测试返回void的方法的效果,例如:

  • 是否会改变对象的状态?
  • 可以抛出异常吗?
  • 是否会修改传递的参数?
  • 它与不同的参数值/状态有什么关系?

如果示例中的计算很复杂,您可能需要拆分方法,以便逻辑位于另一个类(例如计算类)中。在这个类中,它可以有一个或多个可以测试的公共方法。