を報告繰り返しテストを実行します。以下は、テストデータのセットになりますは、など、さまざまなテスト
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
CppUnitは1.14、この機能をサポートしています。そこCPPUNIT_TEST_PARAMETERIZEDとTestCallerは今はstd ::する機能を変換することができます任意の呼び出し可能に受け入れています。どちらも目的の動作を実装するために使用できます。 –
moggi