2011-11-17 78 views
0

我正在尋找添加一些測試到我的應用程序,但我不知道如何做到這一點以及需要什麼。我已經能夠通過創建測試本身來運行基本測試,但是我不能通過將其添加到項目來執行測試。如果我爲測試創建了自己的項目,那麼這些測試是有效的。在現有項目中創建CPPUnit測試需要什麼.cpp和.h文件?

Test1.h

#pragma once 
#include <C:\cppunit-1.12.1\cppunit-1.12.1\include\cppunit\extensions\HelperMacros.h> 
class Test1 : public CPPUNIT_NS::TestCase 
{ 
     CPPUNIT_TEST_SUITE(Test1); 
     CPPUNIT_TEST(testStringAssert); 
     CPPUNIT_TEST_SUITE_END(); 

public: 

    Test1(void); 
    ~Test1(void); 

    void testStringAssert(); 
}; 

Test1.cpp

#include "Test1.h" 
#include "string" 

CPPUNIT_TEST_SUITE_REGISTRATION(Test1); 

Test1::Test1(void) 
{ 
} 

Test1::~Test1(void) 
{ 
} 
void Test1::testStringAssert(){ 
    std::string s1 = "1234567"; 
    std::string s2 = "1234567"; 
    CPPUNIT_ASSERT_EQUAL(s1, s2); 

} 

CPPUnitMain.cpp(從CPPUnit的例子夾取)

#include <cppunit/CompilerOutputter.h> 
#include <cppunit/TestResult.h> 
#include <cppunit/TestResultCollector.h> 
#include <cppunit/TestRunner.h> 
#include <cppunit/TextTestProgressListener.h> 
#include <cppunit/BriefTestProgressListener.h> 
#include <cppunit/XmlOutputter.h> 
#include <cppunit/extensions/TestFactoryRegistry.h> 
#include <stdexcept> 
#include <fstream> 


int 
main(int argc, char* argv[]) 
{ 
    // Retreive test path from command line first argument. Default to "" which resolve 
    // to the top level suite. 
    std::string testPath = (argc > 1) ? std::string(argv[1]) : std::string(""); 

    // Create the event manager and test controller 
    CPPUNIT_NS::TestResult controller; 

    // Add a listener that colllects test result 
    CPPUNIT_NS::TestResultCollector result; 
    controller.addListener(&result);   

    // Add a listener that print dots as test run. 
#ifdef WIN32 
    CPPUNIT_NS::TextTestProgressListener progress; 
#else 
    CPPUNIT_NS::BriefTestProgressListener progress; 
#endif 
    controller.addListener(&progress);  

    // Add the top suite to the test runner 
    CPPUNIT_NS::TestRunner runner; 
    runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest()); 
    try 
    { 
    CPPUNIT_NS::stdCOut() << "Running " << testPath; 
    runner.run(controller, testPath); 

    CPPUNIT_NS::stdCOut() << "\n"; 

    // Print test in a compiler compatible format. 
    CPPUNIT_NS::CompilerOutputter outputter(&result, CPPUNIT_NS::stdCOut()); 
    outputter.write(); 

// Uncomment this for XML output 
    std::ofstream file("tests.xml"); 
    CPPUNIT_NS::XmlOutputter xml(&result, file); 
    xml.setStyleSheet("report.xsl"); 
    xml.write(); 
    file.close(); 
    } 
    catch (std::invalid_argument &e) // Test path not resolved 
    { 
    CPPUNIT_NS::stdCOut() << "\n" 
          << "ERROR: " << e.what() 
          << "\n"; 
    return 0; 
    } 

    return result.wasSuccessful() ? 0 : 1; 
} 

回答

2

它稍微複雜上手。我用過的最好的方法是建立兩個項目之間的關係,最初的真實項目(我稱之爲RealProject)和一個測試項目(我將稱之爲一個TestProject)。你的真實代碼將繼續存在在你的RealProject.vcproj中,但你需要添加第二個項目來存放你的測試代碼。

打開包含RealProject的解決方案文件。在您的解決方案中創建一個新項目,並將其命名爲TestProject。在測試項目中,您將添加CppUnit測試代碼和主函數(如上所述)。如果你現在建立它,它會失敗。添加將使其鏈接的所需屬性。打開TestProject屬性,並在鏈接器/輸入屏幕中編輯其他依賴項字段。從CppUnit添加適當的.LIB文件(如TestRunner.lib)在繼續之前,請在構建之上獲取示例代碼並正確鏈接。小步驟思考。

現在,再次打開TestProject屬性,並在鏈接器/輸入屏幕中編輯Additional Dependencies值。在此列表中,添加包含要測試的代碼的實際項目的對象文件。例如,如果RealProject有一個包含您想測試的某些方法的Foo.cpp,您可以添加$(SolutionDir)RealProject \ Debug \ obj \ Foo.obj。這就是假設這是到目標文件的正確相對路徑,當然。對於不同的版本,你可能有不同的路徑,比如release,x64或其他。首先獲取一個版本,然後應用新發現的知識,使其他版本正確構建。

現在將一個測試套件類添加到TestProject(稱爲FooTest.cpp)以測試Foo.cpp模塊中的方法。確保它構建,鏈接和運行。你現在正在測試你的第一個代碼!恭喜!

您可能希望在源代碼更改時重建測試。右鍵單擊TestProject項目文件夾並選擇Project Dependencies。在RealProject前面添加複選標記。現在,如果您選擇TestProject並構建它,它將確保RealProject是首先構建的。

如果你想一次做到這一點,忘掉它,你可以通配符整個目標文件夾,如下所示:

$(SolutionDir)RealProject\Debug\obj\*.obj 

這樣,每次添加到RealProject模塊可有沒有單元測試寫搞亂項目設置。

這樣做的一個好處是它總是測試你的實際的,事實的編譯代碼。沒有「僞造」編譯器,沒有爲測試目的而對源代碼進行第二次編譯,這是對您的實時代碼的有效測試。另一個好處是,通過將測試代碼保存在單獨的項目中,您不會意外地發送單元測試。它們被編譯成一個完全獨立的文件夾,一個你不會打包並交付給客戶的文件夾。

我真的希望它比這更容易。我希望這是內置在IDE中,並會自動管理所有的簿記和參考資料。任何使測試更容易的方法都會提高開發人員實際使用它的機率。

相關問題