2012/04/28

Test Driven Development for Embedded C ぺアプロの会 第1回 演習補足資料


本エントリは、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と状態を記憶する処理を実装します。

---

以上で最初のとっかかり部分はできました。
サポートもしまずが、後はなるべく自力でがんばってください。

0 件のコメント:

コメントを投稿