데코레이터 노드의 단위 테스트 (Decorator Node Unit Testing)
1. 개요
데코레이터 노드의 단위 테스트는 데코레이터가 자식의 다양한 반환 상태에 대해 올바른 변환, 정확한 횟수 제어, 적시의 타임아웃, 올바른 halt 전파를 수행하는지를 체계적으로 검증한다. 모의(mock) 자식 노드를 사용하여 자식의 반환 상태를 제어하고, 데코레이터의 동작을 독립적으로 테스트한다.
2. 테스트 환경 구성
2.1 모의 자식 노드
자식의 반환 상태를 외부에서 제어할 수 있는 모의 노드를 사용한다.
class MockAction : public BT::SyncActionNode
{
public:
MockAction(const std::string& name,
const BT::NodeConfiguration& config)
: SyncActionNode(name, config),
return_status_(BT::NodeStatus::SUCCESS) {}
void setReturnStatus(BT::NodeStatus status)
{
return_status_ = status;
}
BT::NodeStatus tick() override
{
return return_status_;
}
static BT::PortsList providedPorts() { return {}; }
private:
BT::NodeStatus return_status_;
};
3. 테스트 유형
3.1 반환 상태 변환 테스트
데코레이터가 자식�� 각 반환 상태를 올바르게 변환하는지 검증한다.
TEST(InverterTest, InvertsSuccess)
{
// Inverter(SUCCESS) = FAILURE
mock_child.setReturnStatus(BT::NodeStatus::SUCCESS);
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::FAILURE);
}
TEST(InverterTest, InvertsFailure)
{
// Inverter(FAILURE) = SUCCESS
mock_child.setReturnStatus(BT::NodeStatus::FAILURE);
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::SUCCESS);
}
TEST(InverterTest, PassesThroughRunning)
{
// Inverter(RUNNING) = RUNNING
mock_child.setReturnStatus(BT::NodeStatus::RUNNING);
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::RUNNING);
}
3.2 횟수 제어 테스��
Repeat, Retry 등의 카운��� 기�� 데코레이터의 정확한 횟수 동작을 검증한다.
TEST(RepeatTest, RepeatsCorrectTimes)
{
// Repeat(3)에서 자식이 SUCCESS를 3번 반환
int tick_count = 0;
BT::NodeStatus status;
do {
status = tree.tickOnce();
++tick_count;
} while (status == BT::NodeStatus::RUNNING);
EXPECT_EQ(status, BT::NodeStatus::SUCCESS);
// tick_count는 3 이상 (RUNNING tick 포함)
}
3.3 타이밍 테스트
Timeout, Delay 등의 시간 기반 데코레이터의 정확한 시간 동작을 검증한다.
3.4 Halt 전파 테스트
데코레이터가 halt될 때 자식의 halt가 올바르게 호출되는지 검증한다.
TEST(TimeoutTest, HaltsChildOnTimeout)
{
mock_child.setReturnStatus(BT::NodeStatus::RUNNING);
// Timeout 이전: RUNNING
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::RUNNING);
// 시간 경과 후
std::this_thread::sleep_for(std::chrono::milliseconds(timeout_ms + 100));
// Timeout 만료: FAILURE, 자식 halt 호출
EXPECT_EQ(tree.tickOnce(), BT::NodeStatus::FAILURE);
EXPECT_EQ(mock_child.status(), BT::NodeStatus::IDLE);
}
4. 테스트 조직화
| 테스트 범주 | 검증 내용 |
|---|---|
| 상태 변환 | 각 입력 상태에 대한 출력 상태 |
| 횟수 제어 | 카운터 증가, 종료 조건 |
| 타이밍 | 타임아웃, 지연 정확도 |
| Halt 전파 | 자식 halt 호출, 상�� 초기화 |
| ���트 | 입출력 포트 값 전달 |
5. 참고 문헌
- Google Test 문서. https://google.github.io/googletest/
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |