不返回任何值的函数的单元测试
Unit testing of a function that doesn't return any value
我正在使用cppunit在c++中进行单元测试。我在互联网上看到过一些例子,显示测试一个返回一些值的函数。我有一些函数在我的项目,不返回任何值,但做一些计算里面。这里我想测试这些函数中的计算是否正确,我该怎么做?例如,我有一个函数
void Flash::SerializeToBytes(Buffer &buffer) const
{
// calculations
}
这些自动测试的一般概念总是相同的:您知道,给定特定的输入,函数应该产生特定的结果。将实际结果与你期望的结果进行比较。如果它们相同,则测试通过,否则您的代码或测试中存在错误。
那就是说,让我们试着把它应用到你的具体情况。你通过引用传递buffer
,这样你就可以修改它(否则它应该是一个const引用!)因此,您必须编写测试来调用您的函数,然后检查buffer
发生了什么,而不是检查返回值。在概念上是一样的:您提供一些输入,并将输出与预期的输出进行比较。只是在这种情况下,输出不是返回值,而是用作输入的相同对象。
如果这是不可能的,例如,因为参数是通过const引用或值传递的,你必须了解你的函数是如何与外部世界交互的。如果它没有返回、抛出、修改其中一个输入参数等,那么它就不是这些测试的良好候选者。这可能意味着两件事:它是一个你不关心测试的函数(至少以这种方式),或者你必须重构你的代码。
前者的一个例子是与硬件交互。假设您正在为带有LED的嵌入式系统编写代码,并且您有一个打开或关闭LED的功能。这种情况不适合进行自动测试。跳过它,你不需要用自动测试覆盖100%的代码(参见这个很棒的答案)。
另一方面,也许你的函数与外部世界的交互多亏了全局变量,你的程序大量使用了全局变量(糟糕的想法)。在这种情况下你还能写一些测试(检查全局变量之后发生了什么叫做函数),但你应该是重构你的代码,这样你的函数接受作为参数所需的所有变量,和之后你做了它所有的功能,你可以改变非全局的全局变量,最后得到的函数返回值和/或修改的参数通过引用或指针,对于编写测试是很容易的。
简而言之:如果你有一个不知道如何测试的函数,那么可能为它编写测试是不值得的,或者它是一个指示符,你的代码可能需要一些更改。
如果一个函数没有返回值,它仍然可能有副作用。例如,对象的状态改变(如成员变量/字段)。在您的情况下,看起来通过引用(Buffer
)传递的参数可能会被修改。你可以对它进行测试。
- 它改变对象的状态吗?
- 可以抛出异常吗?
- 是否修改传递的参数?
- 如何处理不同的参数值/状态?
如果你的例子中的计算是复杂的,你可能想要分解方法,以便它的逻辑位于另一个类(例如计算类)。在这个类中,它可以有一个或多个可供测试的公共方法。
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- C++ gmock - 我们如何在单元测试 cpp 文件中读取/获取 cpp 文件函数的参数值
- 在类 gtest/gmock 进行单元测试时模拟成员函数C++
- 如何正确地对 constexpr 函数进行单元测试
- 如何使用私有构造函数对类进行单元测试?
- 在为函数编写单元测试时,我应该模拟所做的内部函数调用吗?
- Qt单元测试:指针列表上的QCOMPARE函数
- 如何检查函数是在C++单元测试中的析构函数中调用的
- 我们应该修改单元测试的函数签名吗?
- 检测单元测试中的特定函数调用
- 单元测试呼叫实例变量的函数
- 如何使用 gtest 对 std::bind 函数进行单元测试
- 如何为将回调作为其参数的函数编写单元测试
- 在单元测试(Nunit或MSTest)中从C#中调用的C 函数的原因是从控制台应用程序中运行的同一代码的不同结果
- 静态函数的单元测试设计模式
- 如何嵌入实时单元测试函数的主体作为 Doxygen 的示例用法
- 使用 Qt 进行单元测试:更改测试函数中使用的标准路径
- 析构函数单元测试会被优化掉吗?