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

时间:2014-01-23 05:22:17

标签: 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 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%的代码覆盖率

1 个答案:

答案 0 :(得分:5)

首先,您可以重写您的函数以避免调用全局对象(如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.

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

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

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