sketch_unittest.cc ファイル
- このファイル内には 2 つのテンプレートが準備されています。
- テンプレート 1 - 一般素子を使用する場合
条件に関係なく動作が実行される状況で使用するテンプレートです。- 例1) 13 番ピンの入出力が正しく設定されていますか?
- 例2) シリアル通信の値を 9600 に正しく設定していますか?
- テンプレート 2 - センサーから値を入力する場合
条件別に実行結果が変わ る状況で使用するテンプレートです。- 例1) 人体検知センサーの測定値が HIGH のとき、LEDが正しく点灯しましたか?
- 例2) 超音波センサーの測定値が 17cm のとき、ピエゾブザーの音を正しく再生しましたか?
- テンプレート 1 - 一般素子を使用する場合
ℹ️ 以下の例のように、テンプレートを必要な数だけコピーして採点基準を複数設定できます。ただし、テストスイート(quiz1
)の数字部分を quiz1
、quiz2
、…など適切に修正する必要があります。
// 例: 採点基準が 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));
- 採点を進める関数の領域によって
setup();
またはloop();
を設定します。- setup() 関数内のコードを確認したい場合
→setup();
のみを残してloop();
を削除 - loop() 関数内のコードを確認したい場合
→loop();
のみを残してsetup();
を削除
- setup() 関数内のコードを確認したい場合
⚠️ setup() 関数と loop() 関数は同時にコードを確認できません。以下の例のように、setup();
と loop();
をそれぞれ分けてテストケースを作成する必要があります。
// 例: setup() 関数も採点し、loop() 関数も採点したい場合
TEST(quiz1, case1) {
...
setup();
...
}
TEST(quiz2, case1) {
...
loop();
...
}
テンプレート 2 - センサーから値を入力する場合
テンプレート 2 構成
- ① 領域 - 使用するセンサーが値を測定するコードをセミコロン (
;
) を除いて記述します。
② 領域 - そのセンサーが測定する値を仮定して記述します。
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));
- ① 領域 - 実行状況を確認したいコードをセミコロン (
;
) を除いて記述します。
② 領域 - そのコードが実行されるべき最小回数を記述します。
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));