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%的代码覆盖率
首先,您可以重写函数以避免调用全局对象(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"可以修改一些(全局)状态,可以在调用之前/之后检查这些状态,看看这些状态是否正确改变.
第三,测试外部功能将被视为集成测试,而不是一次性的单元测试.