/Test_you

電子工作やプログラミングなど、やってみたことのメモ

e2studio(GCC for RX)で、CUnitによる単体テストを試してみた

Renesasのアプリケーションノート「e2studioでのCUnitの使用方法(GCC for RX)(R02AN0525JJ0102)」で紹介されていた内容を、そのまま試してみました

基本的に、資料の通りに進めれば良いのですが、いくつか引っ掛かった箇所があったので記載しておきます。おまけとして、①ビルド後に自動的にテスト実行、②VS Code上で実行を試してます


1. 環境

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から継続的インテグレーション関係のアプリケーションノートが多数発行されてます。特定マイコンに対して、具体的な手順が記載された資料は少ないので、ありがたいです。他の内容も試したいと思ってます


参考にした情報