追記:2013年11月7日:スタックとヒープの設定を追記した。少なすぎると実機で動作しない。
CppUTestを使ってみる
テストフレームワークの一つであるCppUTestを実機で動作させてみる。
ターゲットはTI社製Cortex-M4を搭載したStellaris Launchpad LM4F120(¥550で売ってたヤツ)で、開発環境はTI社謹製のCode Composer Studio v5(以下、CCS)でやってみる。
CCSを起動し、Workspaceに適当な名前(ここではworkspace_LM4F120_CppUTestとした)を入れてOKを押下。
ライブラリの生成
プロジェクトの作成
まず、CppUTestライブラリを生成するプロジェクトを作成する。
File => New => CCS Projectで新規プロジェクトを作成する。
Description | comment |
---|---|
Project name | 何でもいいと思うがここではCppUTestとした |
Output type | ライブラリ形式なのでStatic Libraryを選択 |
Use default location | 今回はソースコードを分離しないのでチェックしたまま |
Variant | 左に120hと入力で絞り込みでき、LM4F120H5QRを選択 |
Project templates | Empty Projectを選択 |
UppUTestのインポート
プロジェクトを右クリック(もしくはプロジェクトを選んでFileメニュー)からImportでImportダイアログを開く。General⇒File Systemを選んでNextをクリック。Browseを押下してCppUTestディレクトリを指定してOKを押下。
次のようにインポートするインクルードファイルとソースファイルを指定する。PlatformsはインクルードではGcc、ソースファイルではIarを選ぶ。なお、ソースファイルに含まれる拡張子dspのような不要なファイルは組み込まない。Finishをクリックしてインポートを実行する。
インポート後のプロジェクトは次のようになる。
プロジェクトの設定
まずインクルードディレクトリを指定する。プロジェクトを右クリック(もしくはプロジェクトを選択してFileメニュー)からPropertiesを選択し、プロパティダイアログを表示する。左のツリービューからBuild⇒ARM Compiler⇒Include Optionsを選択し、右下のディレクトリサーチ追加ペインにあるAddボタンをクリックし、Workspaceボタンから参照して次のようにプロジェクト内のインクルードパスを指定する。
OKを押下すると次のようなディレクトリ指定となるので更にOKを押下する。
ディレクトリパスに追加されていることを確認する。
続けてシンボル定義をしておく。同じプロパティダイアログのツリービューからBuild⇒ARM Compiler⇒Advanced Options⇒Predefined Symbolsを選択し、右上のPre-define NAMEペインのAddボタンをクリックし、次のようにシンボル「_LIB」を定義する。
追加されていることを確認する。
最後に言語オプションで例外ハンドリングを有効にする。同じプロパティダイアログのツリービューからBuild⇒ARM Compiler⇒Advanced Options⇒Language Optionsを選択し、Enable C++ exception handling(--exceptions)にチェックを入れ、OKボタンをクリックする。
開発環境の違いによりtolower()関数が定義されているヘッダファイルが異なっているので、プロジェクトのsrc/Platforms/Iar/UtestPlatform.cppを開き、インクルードファイルにctype.hを追加する。
# include <ctype.h>
ビルド
ビルドを実行(別段の理由が無ければCtrl+Bでよい)し、ライブラリCppUTest.libが生成する。ライブラリファイルはDebug(設定によりRelease)以下に生成される。
テストケースの実装
プロジェクトの作成
続いてテストケースを実装してみる。今回は簡単のため同じワークスペース上でテストケースを実装する。File => New => CCS Projectで新規プロジェクトを作成する。
Description | comment |
---|---|
Project name | 何でもいいと思うがここではLab2とした |
Output type | 実行形式なのでExecutableを選択 |
Use default location | 今回はソースコードを分離しないのでチェックしたまま |
Variant | 左に120hと入力で絞り込みでき、LM4F120H5QRを選択 |
Connection | Stellaris In-Circuit Debug Interfaceを選択 |
Project templates | Empty Project (with main.c)を選択 |
入力が完了したらFinishを押下。
CppUTestなので自動生成されたmain.cをmain.cppにリネームしておく。
インクルードパスの指定
インクルードディレクトリの指定をライブラリの時とおなじ要領で設定する。同じワークスペース上にあるときはWorkspaceボタンを押下して次のように設定すれば良い。なお、ワークスペース内に無いときはFile Systemで指定する。
ライブラリの指定
Build⇒ARM Linker⇒File Search Pathを選び右上のInclude library fileペインでAddボタンを押下し、CppUTest.libを指定する。なお、次画面は指定後の画面。
Addボタンを押下するとAdd file pathダイアログが開くのでWorkspaceボタンを押下し、次のようにワークスペース内にある事前に作成したライブラリを指定する。
確認してOKボタンを押下する。
テストケースの実装
今回の例ではメイン関数にテストケースを直接コーディングして動作を確認する。
# include <CppUTest/CommandLineTestRunner.h>
# include <CppUTest/TestHarness.h>
/* … */
int main()
{
/* … */
static char *argv[] = { "main" };
CommandLineTestRunner::RunAllTests(sizeof(argv)/sizeof(*argv), argv);
/* … */
}
int hoge(void)
{
return 3;
}
int hoge(int a)
{
return a+1;
}
TEST_GROUP(TestSuiteHoge)
{};
TEST(TestSuiteHoge, TestCaseHoge)
{
LONGS_EQUAL(3, hoge());
}
TEST(TestSuiteHoge, TestCaseHoge2)
{
LONGS_EQUAL(3, hoge(2));
}
スタックとヒープの設定
CppUTestのテストを実行するには一定以上のスタックサイズとヒープサイズが必要になる。正確に見積もりしていないが、ここではスタックサイズ2KB、ヒープサイズ8KBを指定した。Build⇒ARM Linker⇒Basic Optionsを選び、Set C system stack sizeに2048、Heap Size for C/C++ dynamic memory allocationに8192を指定する。
結果をコンソール出力
Debug ConfigurationsのMainタブにあるUse the same console for CIO all CPUsにチェックマークを入れておくと、CIOをコンソールに出力してくれる。