鳥なき里のマイコン屋(151) PlatformIOのunittest、使ってみた

Joseph Halfmoon

ホスト機上のテストフレームワーク、テストランナーは定番がありますが、組み込みマイコン上では独自路線が多いのではないかと想像します。そんな中、以前から気になっていたPlatformIOの単体テストランナーを試用してみました。とりあえずサンプルプロジェクトを持ってきて「ちょっと」修正しただけで別ボード対応可。いいんでないかい。

別シリーズで先日、Linux機、Windows機などでC++の単体テストとしては定番のテストフレームワークである GoogleTest(gtest)と、CMakeのテストランナー ctest を使い始めました。

ソフトな忘却力(15) VSCodeで ctest+gtest、CMakeLists.txt

人生複雑にしたくないので、単体テストは gtest でいいじゃん、とも思ったのですが、組み込みのマイコン考えるとそうも言っていられません。

組み込み向けに、超お楽なので大好きなPlatformIOも、単体テストの必要に対応しておりました。以下にご本家解説ページへのリンクを置きました。

Unit Testing

これが組み込み向けによろしい、と思ったのが以下の特長です。

  1. ホスト機上でも実行できるようなテストはマイコン使わずホスト機でもテストできる
  2. マイコン上でないと実行できないテストはマイコンに自動アップロード、自動接続して自動で結果収集までできる
  3. C++非対応のマイコンに配慮しテストプラットフォームはピュアC対応
  4. 流石PlatformIO、テストで不足しているツールとかライブラリなども、自動でダウンロード、インストールしてくれる、ここが楽。

1は結構気になる部分ですかね。マイコンのFlashは有限回の書き換え回数のデバイスです。それにマイコンは表面実装品、半田づけ素人の私は自分で交換などできません。ダメになったらボード交換ですな。経験的には、毎日数十回、1年ほどの間書き換えて使っていたマイコンがあったですが、別に書き換え不能になることはありませんでした。でも単体テストなどをマイコン上でやっていると、直ぐに書き換え回数が膨らんでダメになりそうな気がしてならない小心ものです。実機でないと出来ないところ以外はホストでやっておけるというのは個人的には嬉しいです。

勿論、単体テストのコード自体は書かないとならないですが、テストランナー以前のメンドイところから引き受けてくれる感じがいいです。

今回試用してみたサンプル・プロジェクト

今回は、上記の解説ページからリンクのある、以下のExampleをダウンロードしてきました。

  • まずはご指示どおりに動かしてテスト動作の確認
  • 手元のボードに設定を入れ替えてテストできるかどうか確認

をしてみました。テスト手順そのものは極めて簡単、以下のページに書かれています。

platformio-examples/unit-testing/calculator/

PlatformIOはターゲットマイコンのツールチェーンやライブラリを勝手にダウンロードして使えるようにしてくれる機能があります。しかし、ホスト機の「ネイティブ」ツールチェーンは自動インストールしてくれないようです。解説ページに書かれていますが、最低 「ネイティブ」な gcc をインストールしておいてね、ということであります。

テスト・フレームワークの実体

テストランナーだけでなく、各種セットアップなど至れり尽くせりのPlatformIOですが、テスト・フレームワーク(gtestに相当する部分)は、外部のプロジェクト、以下を使用しているようです。

Unity Project – A Test Framework for C

“Unity” というお名前で検索すると「有名な方」のあれがヒットしてくるので、Test Framework くらい含めないとダメですね。この特徴は「ピュアC」だぞ、というところです。マイコン環境だと確かにピュアC欲しいときがあるかもしれない(この頃は部分的にもC++対応が多いケド。)

サンプルプロジェクトに付属の platform.ini ファイルが以下に。

platformioINI_OLD

3種類のプラットフォームに対応してます。一番下がホスト機のnative設定。一番上が定番中の定番、Arduino Unoですな。真ん中のボードは残念ながら手元に無いので、後でここを手元のボード用に書き換えてみるつもりです。

ネイティブ(ホスト機)上でテスト

今回のホスト機はWindows10機です。native指定でテスト走らせたところが以下に。不足しているものを自動でダウンロードし、ビルド、テストとが、するする走ります。以下は、nativeでも実機でも走る「コモン」部分の結果。PASSEDと。

NativeTest

続いて、native機特有のテスト(実機マイコンと差異があるような部分)のテストも、ビルドしてテストしてくれます。おや、赤い文字でFAILとな。

NativeTest2

ご安心ください。全部がPASSEDでは、本当にテストしているのかどうか怪しいということなのでしょう、わざと間違えるようなテストコードが入れてあったのでした。

ホスト機上でのテスト、ごくごく短時間で完了。

Arduino UNO上でテスト

続いてArduino UNOをホストのUSBポートに接続して、ボード uno を指定してテストを走らせます。流石 PlatformIO、Arduino Uno用の不足ツールをセットアップしてくれるだけでなく、USB接続したArduino UNOを自動で認識してくれています。何もしなくて良くてお楽。以下は最初のビルドとアップロード。

UnoBuild

ホスト上での実行に比べると、ビルドして、アップロードしてFlash書き込み、そして書き込み結果のベリファイといろいろ手間がかかります。しかし全自動でやってくれます。当方は待つだけ。

そして実機TEST開始。まずCommon部分から。PASSEDです。

UnoTest

続いて、組み込み向け(ホストでは走らない部分)のビルドとFlash書き換え作業が再度走ります。

UnoBuild2

書き換え完了すればTEST。ここは「予定どおり」FAILが一つ。ホスト上と比べると時間は多少かかりますが、同様な結果を得られました。

UnoTest2

ターゲットマイコンを切り替え

さて目の前に別件で使用した Nucleo-F401RE(マイコンはST Microelectronics製STM32F401RE、Arm Cortex-M4)が片付けずに残っていました。サンプルプロジェクトのテストコードはそのまま、このボードに対してテストを実施させてみることにいたしました。CPU自体は8ビットのAVR(MicroChip、ATMEL)から32ビットArmに変更ということになります。

手修正したのは platformio.ini ファイルのみ、nucleo_f401re部分の追加です。こんな感じ。

platformioINI_STM32

nucleo_f401reをターゲットにテストを実施させるとこんな感じ。初回なので必要なライブラリのインストールにかなり時間がかかりましたが、ビルド、Flashの書き換え、ベリファイなど皆OKみたいです。しかし赤のFAILが見えるな。

F401RETest

先に全てテストがPASSする筈のCommonカテゴリをテストする筈なのですが、上記のテストで参照しているソースを見ると、FAILが発生する組み込み向けのコードでした。なぜかビルドすべきフォルダが取り違えられているみたい。

続いて組み込み向けのコードのテストの方も再ビルド、再アップロードされて走ります。

F401RETest2

こちらも、組み込み向けのコードでした。一応、実機上でのテストはちゃんと実施されているけれど、どういうわけか COMMON がEMBEDDEDにすり替わってしまっている感じ。今のところ原因不明。

しかし、ま、一応、PlatformIO+Unity でテストは出来そう、な感じがしてます。

鳥なき里のマイコン屋(150) K210、MAiX-BiT、C/C++で恒例Lチカ へ戻る

鳥なき里のマイコン屋(152) 最強の8ビット?Z80の後裔?Rabbit走る へ進む