2013年2月6日水曜日

CppUnit

インストール
  1. CppUnit - C++ port of JUnit | Download CppUnit - C++ port of JUnit software for free at SourceForge.net からダウンロードする
  2. パッケージを解凍する
  3. ./configure
  4. make
  5. make check
  6. 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 件のコメント:

コメントを投稿