- CppUnit - C++ port of JUnit | Download CppUnit - C++ port of JUnit software for free at SourceForge.net からダウンロードする
- パッケージを解凍する
- ./configure
- make
- make check
- sudo make install
使い方
テスト対象のクラスを準備する (Counter.cpp, Counter.h)
Example 1. Counter.h
#ifndef COUNTER_H__
#define COUNTER_H__
class Counter {
private:
int count;
public:
Counter(); // コンストラクタ
int get() const;
void incr();
void clear();
};
#endif
Counter.cpp
#include "Counter.h"
// コンストラクタ
Counter::Counter() {
}
int Counter::get() const {
return count;
}
void Counter::incr() {
count++;
}
void Counter::clear() {
count = 0;
}
Counter クラスをテストするためのクラスを準備するExample 2. CounterTest.h
#ifndef COUNTER_TEST_H__
#define COUNTER_TEST_H__
#include <cppunit/extensions/HelperMacros.h>
#include "Counter.h"
class CounterTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( CounterTest );
CPPUNIT_TEST(test_init);
CPPUNIT_TEST(test_incr);
CPPUNIT_TEST(test_clear);
CPPUNIT_TEST_SUITE_END();
protected:
Counter* c;
public:
void setUp();
void tearDown();
protected:
/* テスト */
void test_init();
void test_incr(void);
void test_clear(void);
};
#endif
CounterTest.cpp
#include "CounterTest.h"
// 以下は CounterTest クラスの実装
CPPUNIT_TEST_SUITE_REGISTRATION(CounterTest);
// 各テスト・ケースの実行直前に呼ばれる
void CounterTest::setUp() {
c = new Counter();
}
// 各テスト・ケースの実行直後に呼ばれる
void CounterTest::tearDown() {
delete c;
}
// これ以降はテスト・ケースの実装内容
void CounterTest::test_init() {
CPPUNIT_ASSERT_EQUAL(0, c->get());
}
void CounterTest::test_incr() {
for (int i = 0; i < 10; i++) {
c->incr();
CPPUNIT_ASSERT_EQUAL((i+1), c->get());
}
}
void CounterTest::test_clear() {
if (c->get() == 0) {
c->incr();
}
c->clear();
// CPPUNIT_ASSERT_EQUAL(0, c->get());
// わざとエラーを発生させてみる
CPPUNIT_ASSERT_EQUAL(1, c->get());
}
実行プログラム本体を準備する (Main.cpp)Example 3. Main.cpp
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/TextOutputter.h>
#include <cppunit/XmlOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>
#include <fstream>
int CompilerOutputterVersion(void)
{
printf("\n\n=== CompilerOutputter ===\n");
// イベント・マネージャとテスト・コントローラを生成する
CPPUNIT_NS::TestResult controller;
// テスト結果収集リスナをコントローラに attach する
CPPUNIT_NS::TestResultCollector result;
controller.addListener(&result);
// 「.」で進行状況を出力するリスナをアタッチする
CPPUNIT_NS::BriefTestProgressListener progress;
controller.addListener(&progress);
// テスト・ランナーにテスト群を与え、テストする
CPPUNIT_NS::TestRunner runner;
runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());
runner.run(controller);
// テスト結果を標準出力に吐き出す
CPPUNIT_NS::CompilerOutputter outputter(&result, CPPUNIT_NS::stdCOut());
outputter.write();
return result.wasSuccessful() ? 0 : 1;
}
int TextOutputterVersion(void)
{
printf("\n\n=== TextOutputter ===\n");
// イベント・マネージャとテスト・コントローラを生成する
CPPUNIT_NS::TestResult controller;
// テスト結果収集リスナをコントローラに attach する
CPPUNIT_NS::TestResultCollector result;
controller.addListener(&result);
// 「.」で進行状況を出力するリスナをアタッチする
CPPUNIT_NS::BriefTestProgressListener progress;
controller.addListener(&progress);
// テスト・ランナーにテスト群を与え、テストする
CPPUNIT_NS::TestRunner runner;
runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());
runner.run(controller);
// テスト結果を標準出力に吐き出す
CPPUNIT_NS::TextOutputter outputter(&result, CPPUNIT_NS::stdCOut());
outputter.write();
return result.wasSuccessful() ? 0 : 1;
}
int XmlOutputterVersion(void)
{
printf("\n\n=== XmlOutputter ===\n");
// イベント・マネージャとテスト・コントローラを生成する
CPPUNIT_NS::TestResult controller;
// テスト結果収集リスナをコントローラに attach する
CPPUNIT_NS::TestResultCollector result;
controller.addListener(&result);
// 「.」で進行状況を出力するリスナをアタッチする
CPPUNIT_NS::BriefTestProgressListener progress;
controller.addListener(&progress);
// テスト・ランナーにテスト群を与え、テストする
CPPUNIT_NS::TestRunner runner;
runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());
runner.run(controller);
// テスト結果を result.xml に書き出す
std::ofstream ofs("result.xml");
CPPUNIT_NS::XmlOutputter outputter(&result, ofs, "shift_jis");
outputter.write();
return result.wasSuccessful() ? 0 : 1;
}
int main(int argc, char* argv[])
{
CompilerOutputterVersion();
TextOutputterVersion();
XmlOutputterVersion();
}
コンパイル
CppUnit のライブラリが置いてある場所を指示するために以下を実行してからコンパイルする。
$ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATHコンパイルオプションに cppunit と dl (動的読み込みライブラリ) をロードするように指定しておく
CMP = g++ CMPOPT = -lcppunit -ldl Main.out: Counter.cpp Counter.h CounterTest.cpp Main.cpp $(CMP) $(CMPOPT) -o $@ Counter.cpp CounterTest.cpp Main.cpp default: Main.out clean: -rm *.out
0 件のコメント:
コメントを投稿