2017-06-02 11 views
3

を報告繰り返しテストを実行します。以下は、テストデータのセットになりますは、など、さまざまなテスト

int countEnglishWords(const std::string& text) 
{ 
    return 5; 
}; 

My機能は、私が代わりに次の候補実装と英語の単語を数える例の機能を使用しますので、無関係です。データの終わりには、単語 "END"を持つ要素がマークされます。

struct TestData { 
    std::string text; 
    int englishWords; 
}; 

struct TestData data[] = // Mark end with "END" 
{ 
    { "The car is very fast", 5 }, 
    { "El coche es muy rapido", 0 }, 
    { "The rain in Spain stays mainly in the plain", 9}, 
    { "XXXXX OOOOO TTTT", 0}, 
    { "Yes Si No No", 3}, 
    { "I have a cheerful live", 5}, 
    { "END", 0} 
}; 

私は簡単に6つのテストケースを書くことができ、私は望む結果を得ることができました。しかし、これは保守できません。テストケースに追加されたテストはテストされないため、別のテストケースが必要になります。これはボイラープレートだけです。したがって、私はこのようなすべての試験データをループする単一のテストケースを書いた:

#include <cppunit/ui/text/TestRunner.h> 
#include <cppunit/extensions/HelperMacros.h> 

class cppUnit_test: public CppUnit::TestFixture 
{ 
private: 
    CPPUNIT_TEST_SUITE (cppUnit_test); 
    CPPUNIT_TEST(myTest); 
    CPPUNIT_TEST_SUITE_END(); 

public: 
    void myTest(); 
}; 

void cppUnit_test::myTest() 
{ 
    TestData* p = data; 
    while (p->text != "END") 
    { 
    std::stringstream ss; 
    ss << "Text=\"" << p->text << "\" Counted=" << 
     countEnglishWords(p->text) << " Expected=" << p->englishWords; 
    CPPUNIT_ASSERT_MESSAGE(ss.str().c_str(), 
       countEnglishWords(p->text) == p->englishWords); 
    ++p; 
    } 
} 

int main() 
{ 
    CPPUNIT_TEST_SUITE_REGISTRATION (cppUnit_test); 
    CppUnit::Test *suite = 
     CppUnit::TestFactoryRegistry::getRegistry().makeTest(); 
    CppUnit::TextUi::TestRunner runner; 
    runner.addTest(suite); 
    runner.run(); 
    return 0; 
} 

問題は、以前のコードでは、第一のテスト罰金を通るとも第二の試験ではなく、後にエラーを検出したということですそれはテストを中止します。そしてレポート:

!!! FAILURES !!!
試験結果:
ラン:1つの失敗:1つのエラー:0

私が取得したいのですが、結果ではあるが:

!!! FAILURES !!!
試験結果:
ラン:6つの失敗:4つのエラー:0

+0

CppUnitは1.14、この機能をサポートしています。そこCPPUNIT_TEST_PARAMETERIZEDとTestCallerは今はstd ::する機能を変換することができます任意の呼び出し可能に受け入れています。どちらも目的の動作を実装するために使用できます。 – moggi

答えて

1

私はすでにあなたのユースケースをサポートすることができ、コメントのCppUnit 1.14.0で述べたように。

私は、あなたが最も簡単な方法はCPPUNIT_TEST_PARAMETERIZEDを使用することです外部の配列を参照します。このマクロは2つのパラメータを必要とします:最初にCPPUNIT_TESTに似ていますが、次に第2のパラメータとして繰り返し可能です。

あなたのコードに基づいて、それは次のようになります。今、私たちはあなたのMYTEST機能を少し調整する必要が

CPPUNIT_TEST_PARAMETERIZED(myTest, aData); 

void cppUnit_test::myTest(const TestData& data) 
{ 
    std::stringstream ss; 
    ss << "Text=\"" << data.text << "\" Counted=" << 
     countEnglishWords(data.text) << " Expected=" << data.englishWords; 

    bool b = countEnglishWords(data.text) == data.englishWords; 
    std::string a = ss.str(); 
    CPPUNIT_ASSERT_MESSAGE(a, 
      b); 
} 

最後に、フレームワークはどのテストが失敗したかを報告する方法を必要とするため、テスト機能に渡されるパラメータを印刷できることが期待されます。この場合、最も簡単な方法は、単純な演算子< <のオーバーロードを追加することです。

std::ostream& operator<<(std::ostream& strm, const TestData& data) 
{ 
    strm << data.text; 
    return strm; 
} 

あなたはこれらを組み合わせた場合は、すぐにあなたが望むように、テストコードを適応せずに、データアレイに限り多くのデータを追加することができます一般的なソリューションを取得する必要があります。

関連する問題