/Test_you

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

RXマイコンで、Unityによる単体テスト環境を作ってみた(後編)

Qiitaの記事「TDDによるマイコンのLチカ開発」を、ルネサス製のRXマイコンIDE(e2studio)の組み合わせで、真似してみました。

  1. RXマイコンで、Unityによる単体テスト環境をセットアップする。
  2. シミュレータ環境、ターゲットボード環境の2通りを用意する。
  3. 元の記事にあった、ホスト環境の構築、CMockの導入は省略。
  • 後編では、テストフレームワークUnityを導入し、テストを行います。
  • 前編はこちら。RXマイコンのプロジェクト生成とprintf()での文字出力を行います。
  • プロジェクト一式は、こちら(rx231_unit_test_1.zip - Google ドライブ)
    インポート方法
    1. メニュー >ファイル > インポート でインポートのダイアログを表示
    2. 既存プロジェクトをワークスペースへを選択
    3. アーカイブ・ファイルの選択でファイルを選択し、終了ボタンでインポート

環境

テストフレームワークの導入

元の記事と同様に、Unityを導入していきます。

1.マイコンIDE上でフォルダを作成する


プロジェクト・エクスプローラーで、新規>フォルダーを選択。以下の構造を作ります。

src/
    - smc_gen/              // 自動生成されたコードが格納されている
    - test/                 // テストファイルを格納 <追加>
    - unity/                // Unityのソースを格納 <追加>
    - rx231_unit_test.c     // メインのソースコード

2. Unityのソースコードをコピー


作成した/src/unity/フォルダに、Unity(https://github.com/ThrowTheSwitch/Unity)の下記ソースをドラック&ドロップで追加します。

  • Unity-master/src
    unity.c, unity.h, unity_internals.h
  • Unity-master/extras/fixture/src
    unity_fixture.c, unity_fixture.h, unity_fixture_internals.h, unity_fixture_malloc_overrides.h

3. テストファイルを用意する


テストファイルを/srt/test/以下に用意します。それぞれ次の用途です。

  • Test0.c - テストグループの定義、および、各テストケースを記述
  • AllTests.c - テストで実行するテストグループを記述
#include "../unity/unity_fixture.h"

// テストグループを定義
TEST_GROUP(Test0);

// 各テストケースの前に実行する共通処理(初期化)
TEST_SETUP(Test0)
{
}

// 各テストケースの後に実行する共通処理(後片付け)
TEST_TEAR_DOWN(Test0)
{
}

// テストケース
TEST(Test0, AlwaysFail)
{
    // 何もせず、テストを失敗させて、メッセージを出力する
    TEST_FAIL_MESSAGE("This test always fails.");
}

// テストグループで、実行するテストケースを列挙する
TEST_GROUP_RUNNER(Test0)
{
    RUN_TEST_CASE(Test0, AlwaysFail);
}
#include "../unity/unity_fixture.h"

// 実行するテストグループを列挙する
void RunAllTests(void)
{
    RUN_TEST_GROUP(Test0);
}

4. main関数からテストを呼ぶ


main関数からテストを呼びます。UnityMain()にはコマンドラインオプションが指定できます。ここでは"-v"を渡し、各テストの実行前にテスト名を出力します。

#include "r_smc_entry.h"
#include "unity/unity_fixture.h"

void main(void)
{
#if 1
    // コマンドラインオプション "-v" を指定。
    // -v   詳細(verbose)モード。各テストの実行前にテスト名を出力する。
    int argc = 2;
    const char *argv[] = {"program name", "-v"};
    extern void RunAllTests(void);
    UnityMain(argc, argv, RunAllTests);
#endif
    while(1);
}

5. プロジェクト設定


  • プロジェクトの設定で、math.h のライブラリを生成するよう変更します1
    • プロジェクトエクスプローラから、プロパティ > C/C++ ビルド > 設定 を選択
    • ツール設定のタブより、Library Generator > 構成を選択
    • 構成を[全ての構成]に変更した後、math.hをチェック

    f:id:sonoka_gi:20190623234354p:plain

6. 実行してみる


ターゲットボード環境、シミュレータ環境のそれぞれでビルド・デバック実行し、下記が出力さればOK。

Unity test run 1 of 1
TEST(Test0, AlwaysFail)../src/test/Test0.c:23::FAIL: This test always fails.

-----------------------
1 Tests 1 Failures 0 Ignored 
FAIL

f:id:sonoka_gi:20190623234409p:plain

最後に

シミュレータとRenesas Debug Virtual Consoleのおかげで単体テスト環境構築は簡単です。いつものIDE環境に+αで気軽にテストを始められるのは良いと思います 。(これから先が大変なんでしょうけど・・・)
シミュレータ環境は通常の単体テストに。ターゲットボード環境はハードウェアの動作確認に利用できそうです。

参考にした情報

  1. Qiita - @iwatake2222 さん

    ⇒ 今回やってみる動機となった記事です。

  2. 書籍 - テスト駆動開発による組み込みプログラミング―C言語とオブジェクト指向で学ぶアジャイルな設計

  3. ルネサスのドキュメント - e2 studioでのUnityの使用方法(R20AN0313JJ0100)
    ⇒ 今回は参考にしてませんが、以前、アプリケーションノートを発行していたようです。


  1. これを設定しないと_FDxxxxが見当たらないというエラーがでました。