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

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

最佳答案

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

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

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

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

另一方面,也许由于全局变量,您的函数与世界其他地方进行了交互,因此您的程序大量使用了(可怕的想法)。在这种情况下,您仍然可以编写一些测试(只需在调用函数后检查全局变量发生了什么),但是您应该做的就是重构代码,以便函数将所需的所有变量作为参数接收,在完成所有函数的操作后,可以将全局变量更改为非全局变量,最后得到返回值和/或修改作为引用或指针传递的参数的函数,为此编写测试简单。

简而言之:如果您有一个不知道如何测试的功能,则可能不值得为此编写测试,或者它表明您的代码可能需要进行一些更改。

关于c++ - 不返回任何值的函数的单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32268019/

10-11 22:38
查看更多