読者です 読者をやめる 読者になる 読者になる

.logbook

学んだことを書き綴る、言わば航海日誌です。

ETロボコンで使うAPIをモック化してみた

これは、ETロボコン Advent Calendar 2014 - Adventarの 14日目のエントリーです。

本カレンダー初の2日連続投稿となってしまいました。

やはり、前回の記事の続編となります。

作ってみた

前回の記事で書いた通り、PCMockに付属するRubyスクリプトを使うとMockを自動生成できます。

しかし、ETロボコンで使用するAPIはいくつかのヘッダファイルに分散しているため、プロトタイプ宣言をひとつのファイルにまとめた後にMockを生成しました。

ecrobot_interface.h

mock_ecrobot_interface.h

mock_ecrobot_interface.c

公開した

前回の記事でモックについていろいろ書いてみたものの、実際に動いているところを見ないとMockの用途がわかりにくいと思うので、環境を作って公開しました。

サンプルとしてモータからエンコーダ値を取得して方位を計算するプログラム(direction.c)と、それをテストするためのテストコード(test_direction.c)を同梱しています。

テストコードを読むとわかりますが、モータのエンコーダ値を取得するためのAPIが正しく呼ばれているかチェックし、戻り値のエンコーダ値をテストコード側で指定しています。

これをビルドして、実行すると...

f:id:ylgbk:20141211223658p:plain

テストが実行され、結果が表示されます。

NXTにプログラムを転送することなく、ロジックのチェックが完了します。

付録:使い方(長くなります...)

動かすためにはgit, ruby, gcc, makeとeclipseが必要です。

まずはcloneします。

$ git clone https://github.com/yuuu/etrobo_ut_sample.git
Cloning into 'etrobo_ut_sample'...
remote: Counting objects: 29, done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 29 (delta 2), reused 26 (delta 2)
Unpacking objects: 100% (29/29), done.
Checking connectivity... done.

次にworkspaceを作成してPCUnitをclone, makeします。

$ mkdir workspace
$ cd workspace
$ git clone https://github.com/katono/PCUnit.git
Cloning into 'PCUnit'...
remote: Counting objects: 1906, done.
remote: Total 1906 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1906/1906), 463.81 KiB | 90.00 KiB/s, done.
Resolving deltas: 100% (1174/1174), done.
Checking connectivity... done.
$ cd PCUnit/PCUnit/
$ make
gcc -Wall -W -Os -DPCU_USE_WCHAR -c PCUnit.c
gcc -Wall -W -Os -DPCU_USE_WCHAR -c PCU_Test.c
gcc -Wall -W -Os -DPCU_USE_WCHAR -c PCU_Suite.c
gcc -Wall -W -Os -DPCU_USE_WCHAR -c PCU_Libc.c
ar rcs libpcunit.a PCUnit.o PCU_Test.o PCU_Suite.o PCU_Libc.o
$ cd ../../

workspaceディレクトリをワークスペースに指定してeclipseを開きます。

プロジェクトのインポートダイアログを開き、cloneした「etrobo_ut_sample」を指定します。

f:id:ylgbk:20141211223443p:plain

f:id:ylgbk:20141211223521p:plain

プロジェクトをビルドした後、シェル上で

$ cd etrobo_ut/
$ ./execute_tests.sh 

とすると、テストが実行されます。