sketch_unittest.cc 파일

실습 코드의 정답 여부를 채점하는 테스트케이스를 작성합니다.

  • 이 파일 내에는 2개의 템플릿이 준비되어 있습니다.

    • 템플릿 1 - 일반 소자를 사용할 때 조건과 무관하게 동작이 실행되는 상황에서 사용하는 템플릿입니다.

      • 예시 1) 13번 핀의 입출력을 잘 설정했는가?

      • 예시 2) 시리얼 통신 값을 9600으로 잘 설정했는가?

    • 템플릿 2 - 센서로 값을 입력받을 때 조건별로 실행 결과가 달라지는 상황에서 사용하는 템플릿입니다.

      • 예시 1) 인체 감지 센서의 측정값이 HIGH일 때, LED를 잘 점등했는가?

      • 예시 2) 초음파 센서의 측정값이 17cm일 때, 피에조 부저의 소리를 잘 재생했는가?

ℹ️ 아래 예시처럼, 템플릿을 필요한 개수만큼 복사해서 채점 기준을 여러 개 설정할 수 있습니다. 단, 테스트스위트(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 통신 관련 코드를 확인해야 할 경우, 코드 앞의 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 통신 관련 코드를 확인해야 할 경우, 코드 앞의 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