5.2K Views
September 01, 23
スライド概要
SWEST25 9/1(金) 09:00〜10:10 セッションs2c
【テストからより良い組込みソフトウェア開発を考える】の発表資料
組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 CQ EVカートのオーナーで、ハード・ソフトウェアの改造を通じて自身のスキルアップを日々考え中・・・。 LAPRASポートフォリオ: https://lapras.com/public/k-abe GitHub: http://github.com/grace2riku Qiita: https://qiita.com/juraruming Zenn: https://zenn.dev/k_abe よろしくね。
セッションS2 【テストからより良い組込みソフトウェア開発を考える】 パーソルクロステクノロジー株式会社 第1技術開発本部 第4設計部 設計2課 阿部耕二 SWEST25 2023/9/1 2023 @juraruming
目次 自己紹介 TDD を学ぼうと思った背景 理想のテスト体制について考える 組込みでTDDするうえでの課題 組込みでTDDする際のTips テストに注目し、より良い組込みソフトウェア開発を考える 参考資料 2
テストからより良い組込みソフトウェア開発を考える 自己紹介 名前: 阿部 耕二(あべ こうじ) 所属: パーソルクロステクノロジー株式会社 第1技術開発本部 第4設計部 設計2課 医療機器の組込みソフトウェア開発。C言語。 趣味: 宇宙開発(リーマンサットプロジェクト広報メンバー) LAPRAS ポートフォリオ : https://lapras.com/public/k-abe Twitter: @juraruming 2023 @juraruming 3
テストからより良い組込みソフトウェア開発を考える TDD を学ぼうと思った背景 昨年度、医療機器のバージョンアップで新機能の追加のたびに既存 機能が動かなくなるデグレードが多く発生した。 繰り返されるデグレードの課題解決の案として、テスト駆動開発 (TDD) の学習をはじめた。 学んだこと、実験したことを共有します。何かお役にたてばと思い ます。 4
テストからより良い組込みソフトウェア開発を考える 〜理想のテスト体制について考える〜 理想のテスト体制について考える 現在のテスト体制 実機を使ったテストがテストのメインになっている。 テストに工数がかかる。 機材の準備、テスト環境の構築 -> なにか良い手はないか ? と思っていた 5
テストからより良い組込みソフトウェア開発を考える 〜理想のテスト体制について考える〜 こちらの動画を見てテスト体制の理想、進む方向が明確になった。 参考資料1: 「サバンナ便り〜自動テストに関する連載で得られた知見のまと め〜」t_wada(和田 卓人) 理想のテスト体制で目指すところはピラミッド型。 アイスクリームコーン型のテスト体制から脱却しピラミッド型へ近 づきたい!!! 6
参考資料2より引用 7
参考資料2より引用。開発者のマシンで行うテストはコスト・忠実性 が低い。速度が早いという特徴がある。 8
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDするうえでの課題〜 組込みでTDDするうえでの課題 クロス環境 ホスト環境、ターゲット環境 なにをホストでテストし、なにをターゲットでテストするか? ホスト環境とターゲット環境の違い コンパイラ、コンパイラの制約、不具合 リンクするライブラリ、ライブラリの制約、不具合 アーキテクチャ(型のサイズ、エンディアン) 9
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDするうえでの課題〜 テスト環境の制約(テストフレームワーク) ターゲット環境ではマイコンリソースにより使えるテストフレーム ワークが限られる。 マイコンではつぎの選択肢になることが多い感触 Unity CppUTest 10
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDするうえでの課題〜 テスト環境の制約(テスト実行環境) TDD は RED ⇨ GREEN ⇨リファクタリング のサイクルを早く・リズムよく回すことが望ましい。 ターゲット環境(マイコン)はホスト環境に比べてマシンパワーが貧 弱。 テストコードのダウンロードに時間がかかる FlashROM の書き換え回数が気になる などなど、組込みソフトウェア開発特有の課題がつきまとう。 11
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDするうえでの課題〜 そんな課題がある組込みソフトウェア開発でTDDをするには? なにをホスト環境でやり、なにをターゲット環境でやるのかテスト 戦略・組織の方針が重要と感じた。 ターゲット環境でリズムよくTDDをするための方法として、 RAM でテストコードをダウンロード・テストする、などがある。 12
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 組込みでTDDする際のTips の学び、実験で得たTipsを共有します。 1. ターゲットの統合開発環境で TDD する例 2. NTShell でテスト環境を整える 3. テストを学びのツールとして使う TDD 13
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 1. ターゲットの統合開発環境でTDDする例 マイコンの統合開発環境(以降STM32CubeIDE)にC/C++のテス トフレームワーク(CppUTest)を環境構築した例 STM32CubeIDE に CppUTest を環境構築し、 STM32 マイコンで TDD す る 評価ボード: STMicroelectronics NUCLEO-F446RE CppUTest はライブラリ化しリンクした (v3.8 にて確認。最新は v4.0) ITM で STM32CubeIDE の SWV ITM Data Console にテスト結果を表 示する RAM でテストを実行する STM32 14
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 マイコンの統合開発環境(以降STM32CubeIDE)にC/C++のテス トフレームワーク(CppUTest)を環境構築した例 評価ボード NUCLEO-F446RE ハードウェアスペック STM32F446RET6 64 ピン Arm Cortex-M4 コア 180MHz フラッシュ: 512Kbyte STM32 SRAM: 128Kbyte Arm Mbed 対応 15
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 マイコンの統合開発環境(以降STM32CubeIDE)にC/C++のテス トフレームワーク(CppUTest)を環境構築した例 確認できたこと STM32CubeIDE の中で TDD ができた。 CppUTest のテスト失敗・成功が期待とおりに動作していることを 確認した。 ITM でテスト結果を表示することができた。 STM32CubeIDE 以外にシリアルコンソールなどのツールも不要。 他のSTMicroelectronics評価ボードでも同様にTDD環境を構築可能な はず(未確認)。 STM32 16
テストからより良い組込みソフトウェア開発を考える マイコンの統合開発環 境 以降 に のテストフレームワーク を環境構築した例 参考)メモリ使用量 RAM 使用量は 79.10% となっ た(128KBのうち101.24KB を使用)。 STM32 ( STM32CubeIDE) C/C++ (CppUTest) 17
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 2. NTShell でテスト環境を整える 前述の【1. STM32マイコンの統合開発環境(以降STM32CubeIDE)に C/C++ のテストフレームワーク (CppUTest) を環境構築した例】ではテ ストを任意のタイミングで実行することができなかった。 そこでシリアルコンソールからのコマンドをトリガにして、軽量シェ ル(NTShell)経由でテストを実行できる環境を作った。 STM32CubeIDE に CppUTest を環境構築し、 STM32 マイコンで TDD す る(2) ~シリアル通信でCppUTestを実行する~ 18
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 とは? 組込み向けの軽量なシェル。 NTShell Natural Tiny Shell (NT-Shell) を使うことで容易にシェル、シェル経由で実行するコマンド を実現できる。 今回はcpputestというコマンド名でCppUTestを使ったテスト機能を 組み込んだ。 NTShell >help help :This is a description text string for help command. info :This is a description text string for info command. read_userbutton :User button B1 reads. write_led :Write to LED LD2. cpputest :Exec CppUTest. 19
テストからより良い組込みソフトウェア開発を考える 使用方法 シリアルコンソールに接続 し、コマンド名称をタイプ し、エンターキーを押下す る。 >cpputest .. ../Core/Src/test_src.cpp:10: error: Failure in TEST(FirstTestGroup, FirstTest) FAIL: FirstTestGroup, FirstTest . Errors (1 failures, 3 tests, 3 ran, 3 checks, 0 ignored, 0 filtered out, 0 ms) 20
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 使用方法2 CppUTest のオプションをそのまま使える。下記は【 -v 】オプションを 指定し、テストの詳細を表示している。 どのテストを実行しているか明確になった。 >cpputest -v TEST(FirstTestGroup, IntSize) - 0 ms TEST(FirstTestGroup, SecondTest) - 0 ms TEST(FirstTestGroup, FirstTest) ../Core/Src/test_src.cpp:10: error: Failure in TEST(FirstTestGroup, FirstTest) FAIL: FirstTestGroup, FirstTest - 0 ms Errors (1 failures, 3 tests, 3 ran, 3 checks, 0 ignored, 0 filtered out, 0 ms) 21
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 使用方法3 CppUTest のオプションの一部を紹介する。 cpputest -v -r3 n テストを 回繰り返すオプションは-rn。実行回数で挙動が変わるこ と・または変わらないことをテストする時などに使えそう。 cpputest -gFirstTestGroup -nFirstTest -gxxx -nxxx にはテストグループ名、 にはテスト名を指定する。指定 テストグループの指定テストを実行する。テストグループの任意の テストだけを実行したいときに使えそう。 22
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 3. テストを学びのツールとして使う もしTDDをプロダクトコードのテストのみに使っていたらもったいな い。 つぎの用途にTDDを使った事例を紹介する。 1. プログラミング言語の学習として TDD を使う 2. ライブラリの挙動を確認する 23
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 プログラミング言語の学習としてTDDを使う C++ のデフォルト引数の動作を学習するテスト プログラミング言語の学習にTDDを使うのも有効かと思う。 C++ のデフォルト引数の動作を学習するテスト デフォルト引数の学習用コードの定義 1. #ifndef __DEFAULT_ARGUMENT_H #define __DEFAULT_ARGUMENT_H int defargtest_add(int a = 1, int b = 2); #endif 24
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 デフォルト引数を使わない // TEST(CppLerningTestGroup, defaultArgumentNone) { LONGS_EQUAL(7, defargtest_add(3, 4)); } 第 引数のみデフォルト引数 コンパイルエラー // 1 -> //TEST(CppLerningTestGroup, defaultArgument_arg1) //{ // LONGS_EQUAL(4, defargtest_add(, 3)); //} 第 引数のみデフォルト引数 // 2 TEST(CppLerningTestGroup, defaultArgument_arg2) { LONGS_EQUAL(2, defargtest_add(0)); } 第 引数ともにデフォルト引数 // 1, 2 TEST(CppLerningTestGroup, defaultArgument_arg1_2) { LONGS_EQUAL(3, defargtest_add()); } 2023 @juraruming 25
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 プログラミング言語の学習としてTDDを使う 今回は例としてC++のデフォルト引数の動きを確認するテストだっ た。プログラミング言語の学習をするテストや組込みソフトウェアの 特徴的な動作をテストを書いて確認することは学習としても良いと思 う。 ポインタのアドレス演算 CPU の int 型のサイズ エンディアンの確認 初期値付き変数コピー、0クリア領域の0クリア その他 1. 26
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 ライブラリの挙動を確認する ライブラリで動作に確認が持てない場合などはテストで確認する。 今回は2038年問題の対応状況を確認する目的のテストを書き、確認 した。 2038 年問題確認用テストコード 【テスト実施の背景】 以前、仕事でファイルシステムのミドルウェアが組み込まれたソフト ウェアを確認した時に2038年問題に対応していなかった。ドキュメン トを見ると2038年問題対応のマクロがデフォルト無効でビルドされて いた。STM32CubeIDEの対応はどうなっているか気になったのでテス トしてみた。 2. 27
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜
#include
#include
#include
#include
"CppUTest/TestHarness.h"
<time.h>
<string.h>
"2038.h"
TEST_GROUP(FutureProblemTestGroup)
{
};
TEST(FutureProblemTestGroup, pre2038problem)
{
char date_str[256];
memset(date_str, 0x00, sizeof(date_str));
time_t tmr = 2147483647; /* UTC:2038/01/19 03:14:07
日本(UTC+9):
2038/01/19 12:14:07 */
get_date_string(tmr, date_str, sizeof(date_str));
STRCMP_EQUAL("2038/01/19 03:14:07", date_str);
}
TEST(FutureProblemTestGroup, 2038problem)
{
char date_str[256];
memset(date_str, 0x00, sizeof(date_str));
time_t tmr = 2147483647; /* UTC:2038/01/19 03:14:07
(UTC+9): 2038/01/19 12:14:07 */
tmr += 1; /* UTC:1901/12/13 20:45:52
(UTC+9): 1901/12/14 05:45:52 */
日本
//
}
get_date_string(tmr, date_str, sizeof(date_str));
STRCMP_EQUAL("1901/12/13 20:45:52", date_str); //
STRCMP_EQUAL("2038/01/19 03:14:08", date_str); //
日本
このテストは失敗することを確認した
テスト成功: 2038年問題対応済みであることがわかった
28
テストからより良い組込みソフトウェア開発を考える 〜組込みでTDDする際のTips〜 テストの結果、2038年問題に対応していることがわかった。 今思えばtime_tの型を調べれば早く2038年問題に対応しているかわ かりますね 29
テストからより良い組込みソフトウェア開発を考える テストに注目し、より良い組込みソフ トウェア開発を考える テストのための時間を捻出する 2. テストをしやすくする便利なツールを使う 3. クラウド環境( Arm Virtual Hardware )でテストする 4. テストをデグレード発見レーダーとして使う 5. テストを資産とする 6. ChatGPT を使ってテストする 7. テストからより良い設計を導く 1. 30
テストからより良い組込みソフトウェア開発を考える 1. テストのための時間を捻出する 時間がないからテストできない。 → 考えればつぎの例のように時間を捻出できることもある。 31
32
テストからより良い組込みソフトウェア開発を考える 前ページの電車内デバッグの例はネタだが、 開発現場でも考えれば時間を捻出できるポイントはあるかもしれな い。 33
テストからより良い組込みソフトウェア開発を考える 2. テストをしやすくする便利なツールを使う 1. NTShell とFake Function FrameworkによるTOPPERSアプリケー ションの単体テスト自動化 3. FFF ( Fake Function Framework ) 4. サニタイザ 5. FTDI デバイス MPSSE 2. GoogleTest 34
テストからより良い組込みソフトウェア開発を考える 1. NTShell NTShell でテスト環境を整えるでも紹介した軽量シェル Natural Tiny Shell (NT-Shell) ターゲットでテストをしたいとき、テストのコマンドを受けつける窓 口にしている。 容易に組み込むことができるので重宝している。 個人的に大好きなOSS。 35
テストからより良い組込みソフトウェア開発を考える とFake Function FrameworkによるTOPPERSアプリケー ションの単体テスト自動化 2022 第 12 回 TOPPERS 活用アイデア・アプリケーション開発コンテス ト 活用アイデア部門 銀賞のアイデア TOPPERS 活用アイデア・アプリケーション開発コンテスト コンテスト応募資料 教材コンテンツ GoogleTest と FFF ( Fake Function Framework )で実機不要な自動単 体テスト環境を構築できる。 2. GoogleTest 36
テストからより良い組込みソフトウェア開発を考える (Fake Function Framework) FFF のことは【 GoogleTest と Fake Function Framework による TOPPERS アプリケーションの単体テスト自動化(以降、単体テスト自 動化)】で知った。 単体テスト自動化はGoogleTestとFFFを組み合わせて、TOPPERSアプ リケーションをテストしていたがFFFはベアメタルなシステムにも使え る。 スタブをつくったりテストしやすくなるためのいろいろな機能がある のでFFFのGitHubのREADMEを読んでみることを薦める。 3. FFF FFF 37
テストからより良い組込みソフトウェア開発を考える サニタイザ 組込み装置の実機確認を行うと時間がかかる。 テスト工数は実機確認よりも前の早い段階で不具合が見つけらればも 増加しない。 たとえば、コンパイル時に不具合がみつけられれば実機確認よりもテ ストのコストが安くなる。 そういった場合は アドレスサニタイザ リークサニタイザ を使い、メモリに関するエラーがないかチェックするのも良い。 4. 38
テストからより良い組込みソフトウェア開発を考える デバイス MPSSE I2C ・ SPI の I/F をもつセンサーからデータ取得し動作するシステムがあ るとする。センサーを制御するマイコン部分のハードウェアがないか ら動作確認が進められない、というケースがあるかもしれない。 FTDI 社の MPSSE ケーブルがあれば PC とセンサーを接続しセンサーの 制御プログラム動作確認を進めることが可能。 ソフトウェアのツールだけではなく、ハードウェアのツールも効果的 に使えばテスト工数を減らす場合がある。 FTDI 社の MPSSE ケーブル: 5. FTDI https://ftdichip.com/product-category/products/cables/usb-mpssespi-i2c-jtag-master-cable-series/ 39
テストからより良い組込みソフトウェア開発を考える クラウド環境(Arm Virtual Hardware)で テストする 3. というクラウドの開発環境がある。 クラウドで開発することで 実機レス CI のサイクル回す など従来の実機を使ったテストと比べてメリットがありそう。 Arm Virtual Hardware 40
テストからより良い組込みソフトウェア開発を考える 4. テストをデグレード発見レーダーとして使う 冒頭話したTDD学習のきっかけはデグレードに困っていたため。 もしTDDの環境が整備されており、新機能実装時に前に成功していた テストが失敗すればデグレードに早く気づき、テスト工数を減らすこ とができていた。 テストを蓄積し、活用していくことでデグレードを早期に発見するレ ーダーのような役割を果たすことができる。 41
テストからより良い組込みソフトウェア開発を考える 5. テストを資産とする テストを蓄積することでデグレード発見レーダーになる、と書いた。 そのほかにもテストが資産となること例について考えた。 例えば出荷テストプログラムをTDDで使ったテストをベースにして書 く、などに使えるかもしれない。 TDD でテストした観点で出荷用テストプログラムを書けば、 1 から出 荷用テストプログラムを書くよりも早く、確実なプログラムになりそ う。 42
テストからより良い組込みソフトウェア開発を考える 6. ChatGPT テストする を使って を使ったソフトウェ ア開発・ について言及し ている書籍を購入したので共 有する。 ソフトウェア開発にChatGPT は使えるのか? ―― 設計からコーディングまで AI の限界を探る 小野哲 著 ChatGPT TDD 43
テストからより良い組込みソフトウェア開発を考える 【5-2 TDDによるテストからの実装】でChatGPT(本ではGPT-4を使 用)でTDDを試行していた(コードはPython)。 テストコード、関数の入出力仕様をプロンプトに入力し、テストケ ースを満たすコード生成を依頼する。 生成されたコードを見て、他のコード生成を依頼する 何度でも爆速でコードを生成してくれる。 テストをパスするコードを生成してくれたらリファクタリングを依 頼する まさにTDDのプロセスをChatGPTで回していた。 気になった方は確認してみては如何でしょうか? 私も読書だけでプロンプトはまだ試せていないので確認します 44
テストからより良い組込みソフトウェア開発を考える 7. テストからより良い設計を導く をはじめてみると楽しい。 のレッド→グリーン→リファクタリングをリズムよく回せた時は 特に楽しく、快感。 でもふと思う。 テストすることが目的だったのか?、と。 TDD はその名のとおりテストから駆動する開発手法だった。 何を駆動するかというと【良い設計】。 テストしやすい構造は良い設計といえる。 TDD TDD 45
テストからより良い組込みソフトウェア開発を考える 組込みでTDDをおこなう際の定番本【テスト駆動開発による組み込み プログラミング】でも後半は設計原則SOLIDに触れている。 良いテストを書き、 良い設計を駆動・導き出し、 高凝集・疎結合な構造のソフトウェアをつくる。 そのような構造のソフトウェアは変更しやすく、流用もしやすい。 チーム、組織、会社によい資産となりビジネスの競争力が高まる。 アイスクリーム型のテスト体制からピラミッド型のテスト体制に以降 していけばテスト工数の削減、エンジニアの労働時間削減で成長のた めの学習時間創出にもつながる。 46
テストからより良い組込みソフトウェア開発を考える 時間の創出はエンジニアの幸福度UPにもつながる。 これからもテストに注目し、より良い組み込みソフトウェア開発を考 えていきます。 47
テストからより良い組込みソフトウェア開発を考える ご清聴ありがとうございました 48
テストからより良い組込みソフトウェア開発を考える 宣伝です。 テストしやすいソフトウェアは良い設計、ということで設計(SOLID 原則)について学ぶ勉強会を開催しています。 もしよければ一緒に学びませんか? 次回は9/28(木) 20:45-21:45 Xのスペースで下記で開催予定です。 ソフトウェア設計原則【SOLID】を学ぶ #3 依存性逆転の原則 お待ちしています こちらは先日開催した勉強会です。 ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェース分離の原 則 49
テストからより良い組込みソフトウェア開発を考える 参考資料 「サバンナ便り〜自動テストに関する連載で得られた知見 のまとめ〜」t_wada(和田 卓人) 2. speakerdeck: サバンナ便り〜自動テストに関する連載で得られた知 見のまとめ(2023年5月版) 3. STM32CubeIDE に CppUTest を環境構築し、 STM32 マイコンで TDD する 4. STM32CubeIDE に CppUTest を環境構築し、 STM32 マイコンで TDD する(2) ~シリアル通信でCppUTestを実行する~ 1. youtube: 50
テストからより良い組込みソフトウェア開発を考える ソフトウェア開発にChatGPTは使えるのか? ―― 設計からコーディングまで AI の限界を探る 小野哲 著 6. テスト駆動開発による組み込みプログラミング ―C 言語とオブジェクト指向で学ぶアジャイルな設計 James W. Grenning 著、蛸島 昭之 監訳、笹井 崇司 訳 5. 51