c++ - 如何对 void 函数进行单元测试 CPPUNIT

标签 c++ unit-testing cppunit

我正在使用 CPPUNIT 为我的 C++ 程序进行单元测试

对于非void函数,假设函数add()存在

int add(int num1 , int num2)
{
  return num1+num2;
}

我可以像这样进行单元测试

void newtestclass::add()
{
    int result = add(2,3);
    CPP_ASSERT(result == 5 ); 

}

当我尝试对非 void 函数进行单元测试时遇到问题

void printmenu()
{
    cout<<"1) Option A"
        <<endl
        <<"2) Option B";
}

如何对此类函数进行单元测试以确保 100% 的代码覆盖率

我在对其他函数中嵌套的函数进行单元测试时也遇到问题

void menu_select(char x)
{
    if ( x == 'a')
    {
        add();
    }
    else if ( x == 'b' )
    {
        subtract();
    }

}

void menu()
{
  char choice;
  cout<<"a) Add "
      <<endl
      <<"b) Subtract";
  cin>>choice;

  menu_select(choice);

}

如何对此类函数进行单元测试以确保 100% 的代码覆盖率

最佳答案

首先,您可以重写函数以避免调用全局对象(如 std::cout)

void printmenu(std::ostream& stream)
{
    stream << "1) Option A" << std::endl
           << "2) Option B";
}

现在您可以在正常使用中使用printmenu(std::cout); 你可以通过以下方式测试它:

std::stringstream ss;

printmenu(ss);
// Check that ss.str() is what you expect.

您可能必须创建模拟才能使用“假”对象调用您的函数。 (如果 std::stringstream 不存在,则写入 MyStream)

第二,“void function”可能会修改一些(全局)状态,可以在调用之前/之后检查这些状态以查看这些状态是否正确更改。

第三,测试外部功能将被视为集成测试,而不是单元测试。

关于c++ - 如何对 void 函数进行单元测试 CPPUNIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21300008/

相关文章:

java - 使用 Mokito 时,实际对象和模拟对象有什么区别?

unit-testing - CPPUnit 与 CPPUnit2

c++ - cppunit:setUp() 和 tearDown()

c++ - 一次从一 block 内存创建多个 Eigen::VectorXd

c++ - 无法使循环正常工作

c++ - 如何在 Visual Studio 2010 中使用 cpp-netlib?

c++ - 在 C++ win32 控制台应用程序中输出 unicode 符号 π 和 ≈

unit-testing - 带有 angulartics2 的单元测试组件 - 无法绑定(bind)到 'angularticsCategory',因为它不是 'div' 的已知属性

unit-testing - 从 2.2.4 升级到 Grails 2.4.3 后,在单元测试期间,元类更改不会在测试之间重置