2014-09-23 44 views
0

這是我遇到的一對夫婦問題的第一部分,用不同的線索分開。如何正確地測試類

首先,當我創建一個在其他程序中使用的類時,我應該在哪裏放置我的測試代碼。如果我的課程將被其他文件使用,我應該用單獨的文件還是在同一個文件中測試我的課程?

例如:我創建了一個類Token,它在Token.h中聲明並在Token.cpp中實現,但在測試時確保一切正常,可以在Token.cpp中使用main()方法或者當我以後想要使用令牌時會導致問題?如果不是在Token.cpp中,我假設我會用像Token_Test.cpp這樣的單獨文件進行測試?或者我想我可以使用main()在Token中測試,然後一旦我確信它可以按照需要工作,就可以註釋掉它。

謝謝

+0

恕我直言,你的問題是相當過於寬泛。 – 101010 2014-09-23 16:55:33

+0

有趣的是,我不明白我怎麼能更具體,但我會努力成爲。我在問在定義類時人們應該如何努力測試他們的代碼。顯然,如果令牌永遠不會被其他任何東西使用,我可以在Token.cpp中用main()來測試。但是如果我要在其他文件中使用Token,那麼也會有一個main(),Token.cpp中的main()會不會導致問題? – user2386276 2014-09-23 16:58:45

+0

這是Microsoft Visual Studio 2013關於使用C++進行單元測試的資料http://msdn.microsoft.com/zh-cn/library/hh598953.aspx作爲單元測試,它聽起來就像您想要做的一樣。您需要花一些時間閱讀C++中的單元測試。如果你想在某個類中加入main()函數,你應該使用預處理器指令來#ifdef它,而不是註釋掉它。另請參閱http://stackoverflow.com/questions/87794/c-unit-testing-framework和http://stackoverflow.com/questions/242926/comparison-of-c-unit-test-frameworks – 2014-09-23 16:59:14

回答

1

保持您的代碼儘可能與測試分離。理想情況下,測試不應該干擾您的代碼,但這並非總是可行。

+0

我曾經想過,但並不完全確定是否有「最佳做法」 – user2386276 2014-09-23 17:07:54

0

這可能很適合Unit Test這幾乎總是一個完全獨立的可執行文件。我與CPPUnit框架一起工作得很好。

隨着軟件變得越來越複雜(即更多的類等),單元測試可以幫助您保持一個非常穩定和易於維護的狀態。它們當然不是能夠解決所有已知問題的銀彈,但它們將有助於確保每個班級按照預期工作。

0

您絕對希望您的測試代碼與您的測試代碼分離。你並不想讓你的代碼在測試代碼上有任何依賴關係。

在任何規模的項目中,您可能都希望使用unit testing framework在單獨的程序集/庫中編寫測試,但對於足夠小的事情,可以考慮通過將命令行參數傳遞給主函數來運行所有測試。下面是一個簡單的荒謬例如:

Greeting.h:

#pragma once 
#include <string> 

std::string getGreeting(); 

Greeting.cpp:

#include "Greeting.h" 

std::string getGreeting() { 
    return "Hello world!"; 
} 

Test.h:

#pragma once 
void test(); 

Test.cpp的:

#include "Test.h" 
#include "Greeting.h" 

#include <cassert> 
#include <iostream> 

void test() { 
    auto greeting = getGreeting(); 
    assert(greeting == "Hello world!"); 
    std::cout << "Test passes!\n"; 
} 

main.cpp中:

#include "Test.h" 
#include "Greeting.h" 

#include <iostream> 

void run() { 
    std::cout << getGreeting() << "\n"; 
} 

int main(int argc, char *argv[]) { 
    if (argc > 1 && strcmp(argv[1], "-t") == 0) 
    test(); 
    else 
    run(); 
} 

Live demo