타이밍 동작 검증 테스트 (Timing Behavior Verification Tests)
1. 개요
타이밍 동작 검증 테스트는 Timeout, Delay 등 시간 기반 데코레이터의 정확한 시간 제어 동작을 검증하는 테스트이다. 시간 초과, 지연 완료, 타이머 리셋 등의 시간적 동작이 지정된 매개변수에 맞게 올바르게 수행되는지를 확인한다.
2. Timeout 테스트
2.1 시간 내 완료 시 자식 상태 통과
TEST(TimeoutTest, PassesThroughOnTimelyCompletion)
{
mock_child.setReturn(BT::NodeStatus::SUCCESS);
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::SUCCESS);
}
2.2 시간 초과 시 FAILURE 반환
TEST(TimeoutTest, ReturnsFailureOnTimeout)
{
mock_child.setReturn(BT::NodeStatus::RUNNING);
tree.tickOnce(); // RUNNING
// Timeout 경과
std::this_thread::sleep_for(
std::chrono::milliseconds(timeout_ms + 100));
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::FAILURE);
}
2.3 시간 초과 시 자식 halt 호출
TEST(TimeoutTest, HaltsChildOnTimeout)
{
mock_child.setReturn(BT::NodeStatus::RUNNING);
tree.tickOnce();
std::this_thread::sleep_for(
std::chrono::milliseconds(timeout_ms + 100));
tree.tickOnce();
EXPECT_EQ(mock_child.status(), BT::NodeStatus::IDLE);
}
3. Delay 테스트
3.1 지연 중 RUNNING 반환
TEST(DelayTest, ReturnsRunningDuringDelay)
{
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::RUNNING);
}
3.2 지연 완료 후 자식 tick
TEST(DelayTest, TicksChildAfterDelay)
{
mock_child.setReturn(BT::NodeStatus::SUCCESS);
// 지연 경과 전
tree.tickOnce(); // RUNNING
// 지연 경과 후
std::this_thread::sleep_for(
std::chrono::milliseconds(delay_ms + 100));
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::SUCCESS);
}
4. 시간 정밀도 고려
시간 기반 테스트는 시스템 스케줄링에 의한 비결정적 지연이 존재��므로, 정확한 시간 일치를 기대하지 않고 ���용 범��를 설정한다.
// 100ms ± 50ms 허용
EXPECT_TRUE(elapsed_ms >= 50 && elapsed_ms <= 150);
5. 설계 시 고려 사항
5.1 시뮬레이션 시간 대응
std::chrono::steady_clock 기반 데코레이터는 시뮬레이션 시간과 독립적이므로, 시뮬레이션 환경에서 테스트 시 실제 시간이 적용된다.
5.2 CI 환경에서의 타이밍 테스트
CI(Continuous Integration) 환경에서는 시스템 부하에 의해 타이밍이 부정확할 수 있다. 넉넉한 허용 범위를 설정하��나, 타이밍에 의존하지 않는 대안적 검증 방법을 사용한다.
6. 참고 문헌
- Google Test 문서. https://google.github.io/googletest/
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |