sketch_unittest.cc ファイル

  • このファイルには2つのテンプレートが用意されています。

    • テンプレート1 - 一般部品を使用する場合 条件に関係なく実行される状況で使用するテンプレートです。

      • 例1) ピン13の入出力が正しく設定されていますか?

      • 例2) シリアル通信の値は9600に正しく設定されていますか?

    • テンプレート2 - センサーからの値を入力する場合 条件によって実行結果が異なる状況で使用するテンプレートです。

      • 例1) 人感センサーの測定値がHIGHの場合、LEDが正しく点灯していますか?

      • 例2) 超音波センサーの測定値が17cmの場合、ピエゾブザーの音が正しく再生されていますか?

ℹ️ 以下の例のように、必要な数のテンプレートをコピーして複数の採点基準を設定することができます。ただし、テストスイート(quiz1)の数字部分を適切にquiz1quiz2、...などに変更する必要があります。

// 例: 採点基準が3つの場合
TEST(quiz1, case1) {
  ...
}
TEST(quiz2, case1) {
  ...
}
TEST(quiz3, case1) {
  ...
}

テンプレート1 - 一般部品を使用する場合

  1. ①エリア - 実行の有無を確認したいコードをセミコロン(;)を除いて記述します。 ②エリア - そのコードが実行される最小回数を記述します。

EXPECT_CALL(*arduinoMock, _(1)_.Times(AtLeast(_(2)_));

--------------------

// 例1: ピン13を出力に設定するコードが1回以上実行されましたか?
EXPECT_CALL(*arduinoMock, pinMode(13, OUTPUT)).Times(AtLeast(1));

// 例2: 時間に関係なく、実行を一時停止するコードが2回以上実行されましたか?
EXPECT_CALL(*arduinoMock, delay(_)).Times(AtLeast(2));

⚠️ シリアル通信に関連するコードを確認する場合、コードの先頭のSerial.部分を除いて残りの部分を記述します。

// 例1: シリアル通信の値を9600に設定するコードが1回以上実行されましたか?
EXPECT_CALL(*arduinoMock, begin(9600)).Times(AtLeast(1));

// 例2: シリアル通信で「LED ON」という文字列を(改行も含めて)出力するコードが1回以上実行されましたか?
EXPECT_CALL(*arduinoMock, println("LED ON")).Times(AtLeast(1));
  1. 採点を行いたい関数のエリアに応じて、setup();またはloop();を設定します。

    1. setup()関数内のコードを確認したい場合は? → setup();のみ残してloop();を削除します。

    2. loop()関数内のコードを確認したい場合は? → loop();のみ残してsetup();を削除します。

⚠️ setup()関数とloop()関数は同時にコードを確認することはできません。以下の例のように、setup();loop();をそれぞれ分割してテストケースを作成する必要があります。

// 例: setup()関数も採点し、loop()関数も採点したい場合
TEST(quiz1, case1) {
  ...
  setup();
  ...
}
TEST(quiz2, case1) {
  ...
  loop();
  ...
}

テンプレート2 - センサーからの値を入力する場合

  1. ①エリア - 使用するセンサーが値を測定するコードをセミコロン(;)を除いて記述します。 ②エリア - そのセンサーが測定する値を仮定して記述します。

EXPECT_CALL(*arduinoMock, _(1)_.WillOnce(Return(_(2)_));

--------------------

// 例1: もし、2番ピンでHIGH(1)の値を検出した場合...
EXPECT_CALL(*arduinoMock, digitalRead(2)).WillOnce(Return(1));

// 例2: もしECHO(超音波センサー)から1000(約17cm)の値を検出した場合...
EXPECT_CALL(*arduinoMock, pulseIn(ECHO, HIGH)).WillOnce(Return(1000));
  1. ①エリア - 実行の有無を確認したいコードをセミコロン(;)を除いて記述します。 ②エリア - そのコードが実行される最小回数を記述します。

EXPECT_CALL(*arduinoMock, _(1)_.Times(AtLeast(_(2)_));

--------------------

// 例1: ...buzzerで262Hz(C4)の音を200ms再生するコードを1回以上実行しましたか?
EXPECT_CALL(*arduinoMock, tone(9, 262, 200)).Times(AtLeast(1));

// 例2: ...色に関係なく、RGB LEDを点滅させるコードを2回以上実行しましたか?
EXPECT_CALL(*arduinoMock, analogWrite(RED, _)).Times(AtLeast(2));
EXPECT_CALL(*arduinoMock, analogWrite(GREEN, _)).Times(AtLeast(2));
EXPECT_CALL(*arduinoMock, analogWrite(BLUE, _)).Times(AtLeast(2));

⚠️ シリアル通信に関連するコードを確認する場合、コードの先頭のSerial.部分を除いて残りの部分を記述します。

// 例1: シリアル通信の値を9600に設定するコードを1回以上実行しましたか?
EXPECT_CALL(*arduinoMock, begin(9600)).Times(AtLeast(1));

// 例2: シリアル通信で「LED ON」という文字列を(改行も含めて)出力するコードを1回以上実行しましたか?
EXPECT_CALL(*arduinoMock, println("LED ON")).Times(AtLeast(1));

Last updated