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

Com*_*erd 2 c++ unit-testing cppunit

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

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

int add(int num1 , int num2)
{
  return num1+num2;
}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

void printmenu()
{
    cout<<"1) Option A"
        <<endl
        <<"2) Option B";
}
Run Code Online (Sandbox Code Playgroud)

我如何对这些功能进行单元测试,以确保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);

}
Run Code Online (Sandbox Code Playgroud)

我如何对这些功能进行单元测试,以确保100%的代码覆盖率

Jar*_*d42 5

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

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

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

std::stringstream ss;

printmenu(ss);
// Check that ss.str() is what you expect.
Run Code Online (Sandbox Code Playgroud)

您可能必须创建Mock以使用'fake'对象调用您的函数.(写MyStream如果std::stringstream 不存在)

其次,"void function"可以修改一些(全局)状态,可以在调用之前/之后检查这些状态,看看这些状态是否正确改变.

第三,测试外部功能将被视为集成测试,而不是一次性的单元测试.