簡體   English   中英

如何將函數單元測試寫入stdout / std :: cout

[英]How to unit test function writing to stdout / std::cout

我正在研究單元測試。 從我所看到的情況來看,幾乎所有單元測試都使用返回值或輸出參數作為測試用例中的預期值。

沒有返回值或輸出參數的函數的期望值是多少?

例:

void unit_test()
{
  cout << "Hello" << endl;
}

當然,這個功能很簡單。 所以,這個功能似乎不需要單元測試。 但這只是一個樣本。 你認為unit_test函數有副作用嗎? 你會如何測試它?

如果您正在編寫一個您應該測試的函數,那么您應該將其設計為在框架中可測試。 在這里,如果您的測試是在可以驗證進程輸出的進程級別完成的,那么寫入std :: cout就可以了。 否則,您可能希望將輸出流作為函數的參數,如下所示:

void unit_test(std::ostream& os = std::cout) 
{ 
  os << "Hello" << endl; 
} 

然后你可以測試它:

std::ostringstream oss;
unit_test(oss);
assert(oss && oss.str() == "Hello");

如圖所示,制作經過良好測試的軟件需要一些給予和考慮......測試要求反饋到設計中。

編輯:如果您必須測試預先存在的功能而不更改它們,請考慮:

#include <sstream>
#include <iostream>

void f()
{
    std::cout << "hello world\n";
}

int main()
{
    std::ostringstream oss;
    std::streambuf* p_cout_streambuf = std::cout.rdbuf();
    std::cout.rdbuf(oss.rdbuf());

    f();

    std::cout.rdbuf(p_cout_streambuf); // restore

    // test your oss content...
    assert(oss && oss.str() == "hello world\n";
    std::cout << oss.str();
}

單元測試返回void的函數通常涉及發送輸入並捕獲函數在傳遞壞數據時可能拋出的任何異常。 您的功能不接受任何輸入,因此單元測試似乎是不必要的,除非您想要在調用函數時測試極端條件,如內存不足。

一般情況下,您不會對單元測試過程進行單元測試(即您所放置的代碼段不會接受任何輸入且不返回任何值)。 對於初學者,嘗試測試一些函數(獲取一些參數並返回一些值)。

也就是說,你測試副作用 - 你提供的功能的唯一副作用是輸出到控制台的字符,這可能很少被測試。

看看這個入門書:

或者這個:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM