횟수 제어 동작 검증 테스트 (Count Control Behavior Verification Tests)

횟수 제어 동작 검증 테스트 (Count Control Behavior Verification Tests)

1. 개요

횟수 제어 동작 검증 테스트는 Repeat, Retry 등 카운터 기반 데코레이터가 지정된 횟수만큼 정확하게 자��을 반복/재시도하고, 카운터가 올바르게 관리되는지를 검증하는 테스트이다.

2. Repeat 테스트

2.1 정확한 횟수 반복 검증

TEST(RepeatTest, RepeatsExactly3Times)
{
    int child_tick_count = 0;
    mock_child.onTick([&]() {
        ++child_tick_count;
        return BT::NodeStatus::SUCCESS;
    });

    // num_cycles=3
    BT::NodeStatus status;
    do {
        status = tree.tickOnce();
    } while (status == BT::NodeStatus::RUNNING);

    EXPECT_EQ(status, BT::NodeStatus::SUCCESS);
    EXPECT_EQ(child_tick_count, 3);
}

2.2 FAILURE에 의한 조기 중단

TEST(RepeatTest, StopsOnFailure)
{
    int count = 0;
    mock_child.onTick([&]() {
        ++count;
        return (count == 2) ? BT::NodeStatus::FAILURE
                            : BT::NodeStatus::SUCCESS;
    });

    BT::NodeStatus status;
    do { status = tree.tickOnce(); }
    while (status == BT::NodeStatus::RUNNING);

    EXPECT_EQ(status, BT::NodeStatus::FAILURE);
    EXPECT_EQ(count, 2);  // 2번째에서 중단
}

3. Retry 테스트

3.1 재시도 후 성공

TEST(RetryTest, SucceedsAfterRetries)
{
    int count = 0;
    mock_child.onTick([&]() {
        ++count;
        return (count == 3) ? BT::NodeStatus::SUCCESS
                            : BT::NodeStatus::FAILURE;
    });

    BT::NodeStatus status;
    do { status = tree.tickOnce(); }
    while (status == BT::NodeStatus::RUNNING);

    EXPECT_EQ(status, BT::NodeStatus::SUCCESS);
    EXPECT_EQ(count, 3);
}

3.2 모든 재시도 소진

TEST(RetryTest, FailsAfterAllAttempts)
{
    mock_child.setReturn(BT::NodeStatus::FAILURE);

    BT::NodeStatus status;
    do { status = tree.tickOnce(); }
    while (status == BT::NodeStatus::RUNNING);

    EXPECT_EQ(status, BT::NodeStatus::FAILURE);
}

4. halt �� 카운터 리셋 검증

TEST(RepeatTest, ResetsCounterOnHalt)
{
    // 2회 실행 후 halt
    tree.tickOnce();  // RUNNING (count=1)
    tree.tickOnce();  // RUNNING (count=2)
    tree.haltTree();

    // 재시작 �� ��음부터
    int count = 0;
    mock_child.onTick([&]() { ++count; return SUCCESS; });

    BT::NodeStatus status;
    do { status = tree.tickOnce(); }
    while (status == BT::NodeStatus::RUNNING);

    EXPECT_EQ(count, 3);  // 전체 3회 반복 (리셋 확인)
}

5. 참고 문헌

  • Google Test 문서. https://google.github.io/googletest/
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-05초안 작성