昨日発生していたサイトログインできない不具合は修正されております(詳細はこちら)

Test Driven Development for Embedded C読書会第4回

2012/6/3(日)に開催した「Test Driven Development for Embedded C」読書会第4回のまとめてす。 本日のネタは以下です。そろそろ本格的に依存関係のあるモジュールに対してTest Doubleを導入する方法について解説が進んでいます。なかなか歯ごたえある内容。 ・第7章「Introducing Test Doubles」 Stub、Mock、SpyといったTest Doubleの種類、Test Doubleを使う目的などが解説されています。 続きを読む
2
Harlequin Shrimp @EspernaShrimp

実コードはlibにテストダブルは.oにする。テストビルド時、まず、.oでリンクが解決され、ライブラリの実コードは参照されない。実ビルドでは単純にテストダブルの.oを除外すればいい!!なるほど!!#tdd4ec

2012-06-03 15:30:04
Yohei @legoboku

テスト用ビルドと実ビルドはどう分ける?ターゲットを分けておくとか。 #tdd4ec

2012-06-03 15:30:54
Yohei @legoboku

クロスコンパイル環境ではよくやるな。 #tdd4ec

2012-06-03 15:31:32
Yohei @legoboku

C言語はコンパイル時に全てを解決しようとする言語仕様なので、Rubyにくらべて柔軟にモックにしにくい。#tdd4ec

2012-06-03 15:43:24
Harlequin Shrimp @EspernaShrimp

テストによって、CUTを変える際にバイナリを気安く分けるというのはよろしくない。ちゃんと考えて運用しないといけない。#tdd4ec

2012-06-03 15:43:47
Yohei @legoboku

プロジェクトファイルのわけかたとか議論してもいいな。 #tdd4ec

2012-06-03 15:43:48
Yohei @legoboku

ハードやOSがない場合、逆に実装の詳細を気にせずに抽象的なインタフェースの設計に集中できる。 #tdd4ec

2012-06-03 15:48:08
Yohei @legoboku

Spy codeはファイルスコープにしておき、Spyされる側からは内部の動作が見えないようにする。インスタンス生成コードで初期化する。 #tdd4ec

2012-06-03 15:50:57
Yohei @legoboku

実装からフェイクを作ることもできるが、メンテが困難になる。テストから始めればテストも書きやすいし、フェイクも作りやすい。 #tdd4ec

2012-06-03 15:51:16
Yohei @legoboku

実コードとテストコードで同じenumを再定義している例があるけど、分ける理由が今一つ分からない。 #tdd4ec

2012-06-03 15:57:40
Yohei @legoboku

コレクションの振る舞いがあるケースについては、何もしない、1個やる、複数やるの3種類をやる。0-1-Nパターン。#tdd4ec

2012-06-03 16:07:35
Yohei @legoboku

何もしないテストは境界値テストとして存在価値がある。#tdd4ec

2012-06-03 16:09:11
Harlequin Shrimp @EspernaShrimp

何もしないテストはIF定義のテストのようなものか。#tdd4ec

2012-06-03 16:12:30
Yohei @legoboku

collaboratorのヘッダファイルをインタフェースとして、実装のソースファイルをSpyに置き換え。インタフェース経由でアクセスすることもあるし、Spyとしても使えたり。OO言語の継承を実現するやり方。#tdd4ec

2012-06-03 16:24:21
Yohei @legoboku

本番は実コードのインスタンスが渡され、テスト時はテストコードのインスタンスが渡される。 #tdd4ec

2012-06-03 16:28:32
Yohei @legoboku

普通にオブジェクト指向言語使いたいわな #tdd4ec

2012-06-03 16:29:56
Yohei @legoboku

先のテストを考慮して、今必要ないコードは記述しない。今のテストに必要なコードしか書かない。 #tdd4ec

2012-06-03 16:44:17
Harlequin Shrimp @EspernaShrimp

ホワイトボードはレジュメに添付しました。#tdd4ec

2012-06-03 16:47:17
Yohei @legoboku

将来必要になることを考慮して、部分的な構造体を導入するが、先に必要になるものを全て今実装するわけではない。先を考えないわけでもないし、先に必要になるものを今すべてやるわけでもない。 #tdd4ec

2012-06-03 16:47:50
Harlequin Shrimp @EspernaShrimp

将来必要になることを考慮して、部分的な構造体を導入するが、先に必要になるものを全て今実装するわけではない。実装は後回し。空メソッドだけ作るのと本質的には同じ。 #tdd4ec

2012-06-03 16:52:10
Yohei @legoboku

メソッドの抽出を行う場合、まずは抽出したメソッドのコンパイルチェックを確認してから置き換えを行う。#tdd4ec

2012-06-03 16:54:33
Yohei @legoboku

引数の数が増えると可読性が下がるし、境界値チェックも増える。引数の数を増やさずに関数を増やすようにリファクタリングする。 #tdd4ec

2012-06-03 16:55:45
Harlequin Shrimp @EspernaShrimp

引数を増やすと表記が増えてクライアントコードの負担になる。引数のenumが増えるよりも関数が増えることを選ぶ。#tdd4ec

2012-06-03 16:56:24
Yohei @legoboku

責務の単位で関数を分割する。#tdd4ec

2012-06-03 16:59:18
Yohei @legoboku

テストコードで保護してプロダクトコードをリファクタリングし、プロダクトコードで保護してテストコードをリファクタリングする。お互いに鍵をかけて交互にリファクタリングする。 #tdd4ec

2012-06-03 17:02:31