2014-01-23 28 views
2

我使用的CppUnit做我的C++程序如何做單元測試爲void函數的CppUnit

對於非void函數單元測試,假設函數add()存在

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

我可以做單元測試這樣

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

} 

我遇到問題時,我嘗試對非空穴功能

做單元測試10
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%的代碼覆蓋率

回答

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. 

你可能已經創建模擬來電與「假」的對象你的函數。 (寫MyStream如果std::stringstream不存在)

,「void函數」可以修改一些(全局)狀態,這些狀態可檢查前/後調用,看看這些變化正確。

第三個,測試外部功能將被視爲集成測試,而不是單位測試。

+0

請原諒我的無知,什麼是集成測試? – Computernerd

+0

請參閱[集成測試](http://en.wikipedia.org/wiki/Integration_testing)。簡而言之,它是組合模塊的測試。 – Jarod42