2013-10-20 57 views
0

我有一個測試,其目的是讀取配置類中的CPP單元測試:我們可以調用這個類CppUnit的使用命令行參數

Config 

的配置類有做

Config c; 
c.read("/tmp/random-tmp-directory/test.conf"); 
的能力

random-temp-directory由bash腳本創建,應傳遞到測試二進制文件中。

#!/bin/bash 
TEMPDIR=$(mktemp) 
cp files/config/test.conf $TEMPDIR/. 
./testConfig $(mktemp)/test.conf 

上面創建一個臨時目錄,拷貝我們的臨時文件和經過的路徑測試,因此它可以加載正確的文件。

有沒有辦法告訴CPPUNIT將命令行參數或任何參數發送到測試註冊表?

這裏是我的testConfig.cpp

#include <all the required.h> 

CPPUNIT_TEST_SUITE_REGISTRATION(testConfig); 

int main(int argc, char ** argv) 
{ 
    CPPUNIT_NS::TestResult testresult; 
    CPPUNIT_NS::TestRunner runner; 
    CPPUNIT_NS::TestFactoryRegistry &registry = CPPUNIT_NS::TestFactoryRegistry::getRegistry(); 

    // register listener for collecting the test-results 
    CPPUNIT_NS::TestResultCollector collectedresults; 
    testresult.addListener(&collectedresults); 

    runner.addTest(registry.makeTest()); 
    runner.run(testresult); 

    // Print test in a compiler compatible format. 
    CppUnit::CompilerOutputter outputter(&collectedresults, std::cerr); 
    outputter.write(); 

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

回答

0

考慮將你的代碼至少三種不同的方法:即構建配置文件名部分,讀取配置文件中的一部分,它分析了什麼是部分從配置文件讀取。您可以輕鬆徹底地測試文件名稱構建器和解析器方法。只要你可以簡單地從文件中讀取數據,甚至一次,你應該是金。

[編輯]

例如,您可能有一個string & assembleConfigFileName(string basepath, string randompath, string filename)方法,它在你的路徑和文件名的不同組成部分,並把它們放在一起。一個單元測試應該看起來像這樣:

void TestConfig::assembleConfigFileName_good() 
{ 
    string goodBase("/tmp"); 
    string goodPath("1234"); 
    string goodName("test.conf"); 

    string actual(assembleConfigFileName(goodBase, goodPath, goodName)); 

    string expected("/tmp/1234/test.conf"); 

    CPPUNIT_ASSERT_EQUAL(expected, actual); 
} 

現在您可以測試您是否完全正確地構建完全限定的配置文件名。測試不是試圖讀取文件。測試不是試圖產生一個隨機數字。該測試提供了一個例子,確切地說例程需要採取什麼類型的輸入,並且準確地說明給定輸入的輸出應該是什麼樣子。而且它證明了代碼確實如此。

這個例程從臨時目錄中實際讀取配置文件並不重要。只有它產生正確的文件名纔是重要的。

同樣,您可以構建一個單元測試,以測試代碼中的每種可能流程,包括錯誤場景。假設您編寫了一個異常處理程序,它會在隨機路徑錯誤時拋出異常。你的單元測試將測試例外機制:

void TestConfig::assembleConfigFileName_null_path() 
{ 
    string goodBase("/tmp"); 
    string nullPath; 
    string goodName("temp.config"); 

    CPPUNIT_ASSERT_THROW(assembleConfigFileName(goodBase, nullPath, goodName), MissingPathException); 
} 

測試現在是一個文檔,說明它是如何工作的,以及它究竟是如何失敗的。而且他們每次運行測試都會證明它。

你似乎試圖做的事情是創建一個系統測試,而不是單元測試。在單元測試中,您不希望隨機傳遞配置文件。你不是試圖測試外部依賴關係,文件系統的工作原理,shell腳本的工作原理,$ TMPDIR的工作原理,都不是。你只是試圖測試你編寫的邏輯是否有效。

在操作系統中測試隨機文件非常適合自動化系統測試,但不適用於自動化單元測試。

+0

您如何知道要讀取哪個文件?讀取的文件作爲參數傳入。所以相同的代碼可以在多個文件上運行。我通過使用靜態變量來繞過它,這不是很漂亮,但它是它是什麼 –

+0

使用依賴注入。將文件名傳遞給配置文件命名方法的參數。輸出應該是文件的完全限定名稱。將名稱傳入文件閱讀器。文件讀取器的輸出應該是一堆數據(可能是一個流)。將流傳遞到解析器,並獲取配置信息。現在,您可以通過在測試代碼中創建strstream來單元測試解析器,並且可以測試有關配置文件值的所有內容,而無需實際配置文件。你可以單元測試名稱創建者,而不必打開一個實際的配置文件。 –

+0

林不知道我跟着,您的答案可能是一個僞代碼擴展? –