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

Unit testing of a function that doesn't return any value

本文关键字:函数 单元测试 任何值 返回      更新时间:2023-10-16

我正在使用cppunit在c++中进行单元测试。我在互联网上看到过一些例子,显示测试一个返回一些值的函数。我有一些函数在我的项目,不返回任何值,但做一些计算里面。这里我想测试这些函数中的计算是否正确,我该怎么做?例如,我有一个函数

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

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

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

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

前者的一个例子是与硬件交互。假设您正在为带有LED的嵌入式系统编写代码,并且您有一个打开或关闭LED的功能。这种情况不适合进行自动测试。跳过它,你不需要用自动测试覆盖100%的代码(参见这个很棒的答案)。

另一方面,也许你的函数与外部世界的交互多亏了全局变量,你的程序大量使用了全局变量(糟糕的想法)。在这种情况下你还能写一些测试(检查全局变量之后发生了什么叫做函数),但你应该是重构你的代码,这样你的函数接受作为参数所需的所有变量,和之后你做了它所有的功能,你可以改变非全局的全局变量,最后得到的函数返回值和/或修改的参数通过引用或指针,对于编写测试是很容易的。

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

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

通常,您需要测试返回void的方法的效果,例如:
  • 它改变对象的状态吗?
  • 可以抛出异常吗?
  • 是否修改传递的参数?
  • 如何处理不同的参数值/状态?

如果你的例子中的计算是复杂的,你可能想要分解方法,以便它的逻辑位于另一个类(例如计算类)。在这个类中,它可以有一个或多个可供测试的公共方法。