簡體   English   中英

cppunit使用命令行參數

[英]cppunit to use command line arguments

我有一個CPP單元測試,它測試一個旨在讀取配置的類:我們可以調用該類

Config

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

上面的代碼創建了一個temp目錄,復制了我們的臨時文件,並將路徑傳遞給測試,以便它可以加載正確的文件。

有沒有辦法告訴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;
}

考慮將代碼至少分為三種不同的方法:用於構造配置文件名稱的部分,用於讀取配置文件的部分以及用於分析從配置文件讀取的內容的部分。 您可以輕松而徹底地對文件名構建器和解析器方法進行單元測試。 而且,只要您可以測試甚至僅一次讀取文件中的數據,就應該是黃金。

[編輯]

例如,您可能有一個像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是否正常工作等等。 您只想測試您編寫的邏輯是否有效。

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

暫無
暫無

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

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