本エントリは、5/6(日)に行う「Test Driven Development for Embedded C ぺアプロの会 第1回」の補足資料です。最初のテストを書くまでが大変になりそうなので、演習をスムーズに進める目的で作成しました。
本エントリの範囲
第8章 p.138 「8.4 Spying on the Code Under Test」までです。それ以降は口頭ベースでやり取りしましょう。
サンプルコード
第8章のソースコードとテストコードを抜いたものを以下に置いています。これをベースに演習を進めてください。
https://github.com/yohei1126/embeddedtdd/zipball/chapter8_init
コードの書き方の細部が分からない場合は、公式サイトのソースコードを参照してください。こちらは全てのコードが入っています。
http://pragprog.com/titles/jgade/source_code
サンプルコードの動作確認
解凍したら make all してください。エラーなしにビルドが通ればOKです。
テストリストの確認
p.130のFigure 8.1 Light Scheduler Test Listを参照してください。本章ではこのテストを一通り消化します。
この時点では全て内容を把握する必要はありません。テストが1個終われば、確認すれば良いでしょう。
テスト対象の設計の確認
p.134のFigure 8.4 Light Scheduler Unit Test Structureを参照。テスト対象のLightSchedulerは、LightControllerとTimerServiceのインタフェースにのみ依存します。テスト中は、LightControllerとTimerServiceをTestDoubleに置き換えることで、テスト可能にします。
p.136 LightControllerSpyのCreateのテスト
p.134~135のテストは途中で中断します。最初はp.136のLightControllerSpyのCreateのテストから始めた方が良いです。
LightControllerSpyTest.cppのテストコードを記述
まずはp.136のテストコードを一通り書いてみましょう。テストコードの配置場所は以下になります。
tests\HomeAutomation\LightContollerSpyTest.cpp
CppUTestでテストする際に以下は必須です。
- TestHarness.hのインクルード
- TEST_GROUPの宣言
また、C++のテスティングフレームワークであるCppUTestを使って、C言語のコードをテストするため、C言語のヘッダファイルをインクルードする際はextern宣言します。
ここで、テストコードを一通り書いた段階でまだプロトタイプ宣言がないため、コンパイルエラーが起きます。
LightControllerのプロトタイプ宣言を実装
コンパイルエラーを解消するため、LightControllerのプロトタイプ宣言を記述します。LightControllerはテスト対象なので、ヘッダファイルの場所はinclude以下になります。
include\HomeAutomation\LightContoller.h
LightControllerSpyのプロトタイプ宣言を実装
コンパイルエラーを解消するため、LightControllerSpyのプロトタイプ宣言を記述します。
LightControllerSpyはTestDoubleなので、ヘッダファイルの場所はtests以下になります。
tests\HomeAutomation\LightContollerSpy.h
ヘッダファイルの定義はp.137を参照してください。ここで定義されているenumはテストでのみ使うため、ここで定義しているそうです。
LightControllerの関数定義を実装
リンクエラーを解消するため、テストコードで使われているLightControllerの関数2つを実装します。
ここでは空実装で構いません。
LightControllerSpyの関数定義を仮実装
リンクエラーを解消するため、テストコードで使われているLightControllerSpyの関数2つを実装します。ここではテストが動いていることを確認するため、わざと明らかに違う値を返します。
例)1000
テストすると、失敗します。
LightControllerSpyの関数定義を本実装
テストを通すための最小限の実装を行います。テストの期待値をそのまま返せばOKです。
p.137 LightControllerSpyのRememberTheLastLightIdControlledのテスト
テストコードを記述
まずはp.137の最初のテストコードを記述します。プロトタイプ宣言がない関数があるのでコンパイルエラーが出ます。
LightControllerのプロトタイプ宣言を実装
コンパイルエラーを取り除くため、LightController.hにLight_Controller_Onを記述します。
LightControllerSpyの関数定義を仮実装
リンクエラーを取り除くため、LightControllerSpy.cにLight_Controller_Onを記述します。
※TestDoubleで置き換えるため、tests側に実装しています。
ここでビルドするとテストに失敗します。
LightControllerSpyの関数定義を本実装
テストを通すために最小限の実装を行います。
p.137~p.138にかけてあるとおり、IDと状態を記憶する処理を実装します。
---
以上で最初のとっかかり部分はできました。
サポートもしまずが、後はなるべく自力でがんばってください。