連続記事#5 テスト駆動開発 はじめの一歩

# 背景・目的
自社向けの勉強会でなにかテーマを決めて、ソフトウェア開発の上流工程から下流工程まで説明する連続講座を開催し、自分のスキルアップしたいと考えました。
講座参加者に学びになれば尚良、と考えました。この記事は講座資料を再掲・補足説明する位置づけにしたいと考えています。

現在予定している講座はつぎのとおりです。

 * 連載記事 #1: [要求の理解](https://qiita.com/juraruming/items/0fecf339735c86fdc2a1)　
 * 連載記事 #2: [要求を仕様化する](https://qiita.com/juraruming/items/d0cb03798850c9d0b5d5)
 * 連載記事 #3: [設計(概要設計)](https://qiita.com/juraruming/items/47a743895eefbe844dcb)
 * 連載記事 #4: [設計(詳細設計)](https://qiita.com/juraruming/items/4d989939a5900e0451e2) 
 * 連載記事 #5: TDD　#1 はじめの一歩 ★いまここ
 * 連載記事 #6: TDD　#2 LEDドライバ(ホストPC編)
 * 連載記事 #7: TDD　#3 LEDドライバ(ターゲット編) 　

今回の講座の資料はこちらにアップロードしました。

[組み込みソフトウェア基礎_【連続講座 #5】テスト駆動開発 はじめの一歩](https://www.docswell.com/s/juraruming/52P665-2022-09-22-225024)

前回は[概要設計から詳細設計を行う](https://qiita.com/juraruming/items/4d989939a5900e0451e2)というタイトルで詳細設計について書きました。
今回はTDDについて書きます。


# テーマについて
テーマは**既存組込み製品(CQ EVカート)のマイコンを変更する**と決めました。
テーマ設定理由、EVカートについての説明は連載記事#2　**要求を仕様化する**の[こちらのリンク](https://qiita.com/juraruming/items/d0cb03798850c9d0b5d5#%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AE%E8%AA%AC%E6%98%8E)を参照ください。 

# テスト駆動開発とは?
文字とおりテストでソフトウェア開発を駆動していきます。
テストが開発の起点となります。
実装→テストではなく、テスト→実装の順番で開発を進めます。

【テスト駆動】してどうする?ですが**テストを書いてより良い設計を導くこと**がTDDの目指すところだと思います。

## テスト駆動開発をやるモチベーション
TDDで次の効果・効用が期待できるかなと考えています。

 * デグレードが少なくなる。
 * リファクタリングでコードが綺麗になる。
 * 開発者の不安が少なくなる(なくなりはしないと思う)。

## 【組込み】でテスト駆動開発をやるモチベーション
 * ハードウェアがなくてもテストができる(手法がある)。
 * ハードウェア・ソフトウェアの不具合要因切り分けが明確になる。
 * ターゲットマイコンの開発環境起因(ターゲットのライブラリにバグがあるなど)の切り分けが可能になる。


## 私がTDDを学びはじめた動機
組込み製品の派生開発（既存機種のバージョンアップ）でデグレードが多く発生しました。
既存機能が正しく動くことを保証しながらも新機能を組み込む技術・ノウハウを学びたいと思いました。
TDDはこの課題を解決するヒントになるのでは?、と思ったことがきっかけです。

## 私がTDDを学んだ感想
 * 素直に楽しい。
 * TDDのサイクル(レッド→グリーン→リファクタリング)を回すのが楽しい。
 * テストを書いてテストが成功したときの快感。
 * 安心できる。
 * コードが成長していく実感が得られる。
 * コードが綺麗に保たれている実感がある。

## 組込みでTDDを推進していくうえでの課題
 * TDD開始前の戦略立案(どこまでTDDを使い、どこからが実機確認なのか、その線引き)
 * テストが難しい領域(例. 組込み装置の画面系)でのTDD活用
 * 良い設計を導くためのTDD活用

現状はテストフレームワークを使いテストを書き、TDDのサイクルを回せるようになったという状況です。
TDDを使った良い設計の例は[TDD学習の参考 4, 5](#TDD学習の参考)が参考になります。

# 環境構築
## テストフレームワークの選択
組込みソフトウェアで使うことが多いC, C++で代表的なテストフレームワークはつぎになるかと思います。

 * Unity
 * CppUTest
 * Google Test

[TDD学習の参考 1](#TDD学習の参考)の本で多く説明されている・マイコンにも組込み可能なテストフレームワークのCppUTestとしました。
ホスト環境でのみTDDするの場合だったらGoogle Test推しの声が多い気がします。

## ターゲットマイコンの選定
TDDの学習をするにあたり、ホストPC&マイコンターゲットでもTDDをしてみたいと漠然と考えていました。
今回はSTマイクロエレクトロニクスのSTM32マイコンボード【NUCLEO-F446RE】に決めました。
以下、マイコンのリソースです。

![STM32マイコンボード NUCLEO-F446RE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/a5b3e1a5-c814-68c9-a146-ab7d1ef616f8.png)


 * STM32F446RET6 64ピン
 * Arm Cortex-M4コア 180MHz
 * フラッシュ: 512Kbyte
 * SRAM: 128Kbyte
 * Arm Mbed対応

## ターゲットマイコンの選定理由
連載のテーマ【既存組込み製品(CQ EVカート)のマイコンを移植する】ではカートのモーター制御をおこないます。
該当マイコンボードに搭載されているマイコンはモーター制御用のタイマー機能を持っていたことがわかったのが理由です。
また個人的に他のSTM32マイコンボードより多く使ったことがあり慣れていたことも理由です。

# テストを書いてみる
## TDDのステップ
TDDはつぎの流れで進めます。この流れを意識します。

 * テストを書く。
 * テスト失敗を確認する(レッド)。
 * テスト成功させるためのプロダクトコードを書く。
 * テスト成功を確認する(グリーン)。
 * テスト成功したままソースコードを綺麗する(リファクタリング)


## TDDサイクルを回してみるデモ
[TDD学習の参考 1](#TDD学習の参考)の写経を行いTDDを学ぶことにしました。
本と一緒にこちらの[リポジトリのブランチ]()のコミットログを追っていただくとTDDの進め方がなんとなくわかると思います。
コミットログは[TDDのステップ](##TDDのステップ)の段階ごとにコミットしていくように意識しました。


## ターゲットボードでTDDしてみた話
前に書いたLEDドライバはホストPCでTDDをやっています。
ターゲットボードでもTDDしてみたかったのでやってみました。

こちらの記事で紹介しています。
[STM32CubeIDEにCppUTestを環境構築し、STM32マイコンでTDDする](https://qiita.com/juraruming/items/1f91db17ba93b40d3730)

結果、ターゲットボードでも簡単な例ですがTDDすることができました。
ただCppUTestのメモリ使用量が該当ターゲットボードのRAMサイズを圧迫しているのでメモリサイズを削減する調整・設定を行う必要があると考えています。


# TDD学習の参考
　1.　[テスト駆動開発による組み込みプログラミング](https://www.oreilly.co.jp/books/9784873116143/)
　2. [［動画で解説］和田卓人の“テスト駆動開発”講座 記事一覧](https://gihyo.jp/list/group/%E5%8B%95%E7%94%BB%E3%81%A7%E8%A7%A3%E8%AA%AC-%E5%92%8C%E7%94%B0%E5%8D%93%E4%BA%BA%E3%81%AE-%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-%E8%AC%9B%E5%BA%A7) 
　3. [『テスト駆動開発による組み込みプログラミング』を読んで学んだこと](https://qiita.com/iwatake2222/items/03e5c856a906fc18cdb5)
　4. [TDDによるマイコンのLチカ開発(1)](https://qiita.com/iwatake2222/items/396959d1d7dffee479f7)
　5. [TDDによるマイコンのLチカ開発(2)(完)](https://qiita.com/iwatake2222/items/05b8d5e76bdc2b0855b6)

# 次回予定
**テスト駆動開発 はじめの一歩**は如何でしたでしょうか?
なにかお役にたてると嬉しいです。
よければ感想などをコメントくださるとありがたく、猫のように喜びます。

次回の自社向け勉強会は10/31(月)で開催予定です。その頃にまた勉強会の内容を記事化したいと考えています。
勉強会の内容はつぎを考えています。

【連続講座 #6】TDD #2 LEDドライバ(ホストPC編)

組込みソフトウェア開発はクロスプラットフォーム開発(開発するPCと組込み装置が実行する環境が異なる)が多いと思います。
例えば、開発PCはWindowsで組込み装置が実行する環境はOSなし、などの環境です。
まずは開発PC(ホストPC)でTDDしたいと思います。


最後まで長文を読んでいただきありがとうございました。次回もよろしくおねがいします。