e2studio(GCC for RX)で、CUnitによる単体テストを試してみた
Renesasのアプリケーションノート「e2studioでのCUnitの使用方法(GCC for RX)(R02AN0525JJ0102)」で紹介されていた内容を、そのまま試してみました
基本的に、資料の通りに進めれば良いのですが、いくつか引っ掛かった箇所があったので記載しておきます。おまけとして、①ビルド後に自動的にテスト実行、②VS Code上で実行を試してます
1. 環境
- Windows 10 Pro: バージョン 21H2、ビルド 19044.2130
- e2studio: 2022-07 (64bit版)
- CUnit: 2.1.2
- コンパイラ: GCC for Renesas RX 8.3.0.202202
- Visual Studio Code: 1.72.2
2. 前提条件
32bit版のe2stuido(V7.8.0)では、うまく行きません。指示通り 64bit版(20xx-xx) を使った方が良いです
V7.8.0でテスト対象プロジェクトをビルドすると、rx-elf-libgen
に--header-files=all
というオプションが指定され、これが解釈できずエラーになりました
3. 「2.2 CUnitライブラリを作成する」について
ライブラリ側のビルド時にいくつか警告が発生します。おそらく、スタック使用量の警告で問題ないと思います
最後の警告(無効なプロジェクト・パス~)は、C/C++一般>パスおよびシンボル>ソース・ロケーションから、/CUnit/generate
を削除すれば消えます
4. 「3.1 テスト対象プロジェクトを作成する」について
アプリケーションノートのpdfファイルから、ソースコードをコピペするとprintf内の改行指示がおかしくなり、テストの出力が文字化けします。ここは手入力した方がよいです
上がコピペした状態、下が正しい状態です
コピペした状態でテストすると、テストの出力が文字化けします
5. 「3.2 CUnit を使用した単体テストを実行する」について
[Show in Local Terminal]>[Terminal]でターミナルを起動するのですが、このメニューは、e2studioインストール時に拡張機能Terminals
を選択してないと表示されません
表示されない場合は、コマンドプロンプトで代用可能です
6. よく分からないこと
以上で、アプリケーションノートの内容は再現できました
ただ、テスト完了後に(Tests completed with return value 0. が表示されてから、プロンプトが表示されるまでに)、10秒くらい間が空きます。これが正しい動作かよく分かりません。テストNG時はエラーメッセージ(Read from unwritten memory at 0xa000001c)が出て、すぐプロンプトに戻るのですが・・・
とりあえずの対策
_Exit() や abort() で強制的にプログラムを終了すると、すぐにコマンドプロンプトに戻るようになりました。exit() では効果がなかったので、両者の違いである atexit()ハンドラ が影響しているのかも知れません
7. おまけ①: ビルド後に自動的にテスト実行する
折角なので、ビルドしたら自動的にテストを実行するようにしてみます。これは、ビルド後のステップで、テストを起動するだけで出来ます
SampleCUnit/Debug
フォルダに、下記ファイルをrun_test.bat
として配置
@echo off REM シミュレータでテストを実行する REM ★GCC for RX のバージョン・インストール先に合わせて rx-elf-run.exe のパスを変更 REM ★プロジェクトの設定に合わせて *.elf のファイル名を変更 echo ******************** test phase ******************** "C:\ProgramData\GCC for Renesas RX 8.3.0.202202-GNURX-ELF\rx-elf\rx-elf\bin\rx-elf-run.exe" SampleCUnit.elf echo ****************************************************
C/C++ビルド>設定>ビルド・ステップにて、ビルド後のステップに
run_test.bat
を入力ビルドを実行すると、続けてテストが実行される
8. おまけ②: VS Code上で実行する
「VS Codeで、RXマイコンの e2studio プロジェクトをビルドする」の記事に従い、ビルドタスクを設定すれば、VS Code上でも「おまけ①」と同様にテストを実行できます
参考までに tasks.json の設定は下記です。★の部分は環境に合わせて調整必要
{ "version": "2.0.0", "tasks": [ { "label": "e2studioプロジェクトのビルド", "type": "shell", // ★eclipsec.exe もしくは e2studioc.exe のフルパスを指定 // e2studioのインストールフォルダ/eclipse/ にあるはず "command": "C:/Renesas/e2_studio_2022-07/eclipse/e2studioc.exe", "args": [ "-nosplash", "--launcher.suppressErrors", "-application", "org.eclipse.cdt.managedbuilder.core.headlessbuild", "-data", // ★e2studioのワークスペースフォルダを指定 "C:/User/e2studio_2022-07", // ★build or cleanBuild を指定 "-build", // ★ビルド対象のプロジェクト/ビルド構成を指定 "SampleCUnit/Debug" ], "group": "build", "presentation": { "reveal": "always", // Terminal パネルを必ず開く "clear": true // 実行前に Terminal をクリア }, "problemMatcher": [] } ] }
9. 最後に
以上で、VS Code上でRXマイコンの単体テストを実施できるようになりました
以前、e2studio上でシミュレータを起動して単体テストをしたのですが、テストがe2studio上に制約されるのは不便に感じました。今回の方法だと、テストがCUIで完結するため、便利になりそうです
今回、Renesasの単体テストに関するアプリケーションノートを参照しましたが、最近、Renesasから継続的インテグレーション関係のアプリケーションノートが多数発行されてます。特定マイコンに対して、具体的な手順が記載された資料は少ないので、ありがたいです。他の内容も試したいと思ってます
参考にした情報
- ERR04-C. プログラムの適切な終了方法を選択する
- exit()、_Exit()、abort() の動作の違いについての説明が参考になりました