경계값 조건 테스트 (Boundary Value Condition Testing)
1. 개요
경계값 조건 테스트(boundary value testing)는 조건 노드의 임계값 또는 경계에서의 동작을 검증하는 테스트 기법이다. 소프트웨어 결함은 경계 조건에서 가장 빈번히 발생하므로, 임계값의 정확한 위, 아래, 동일 값에서의 조건 평가 결과를 체계적으로 검증하는 것이 중요하다.
2. 경계값 분석 방법
2.1 단일 임계값의 경계
임계값 c에 대한 비교 연산의 경계값 테스트 포인트는 다음과 같다.
| 비교 연산 | 테스트 포인트 | 기대 결과 |
|---|---|---|
| v > c | c - \epsilon | FAILURE |
| c | FAILURE | |
| c + \epsilon | SUCCESS | |
| v \geq c | c - \epsilon | FAILURE |
| c | SUCCESS | |
| c + \epsilon | SUCCESS | |
| v < c | c - \epsilon | SUCCESS |
| c | FAILURE | |
| c + \epsilon | FAILURE |
여기서 \epsilon은 테스트 정밀도를 나타내는 작은 양수이다.
2.2 범위 비교의 경계
범위 [c_{\min}, c_{\max}]에 대한 경계값 테스트 포인트는 다음과 같다.
| 테스트 포인트 | 기대 결과 |
|---|---|
| c_{\min} - \epsilon | FAILURE (범위 미만) |
| c_{\min} | SUCCESS (하한 경계) |
| (c_{\min} + c_{\max}) / 2 | SUCCESS (범위 내부) |
| c_{\max} | SUCCESS (상한 경계) |
| c_{\max} + \epsilon | FAILURE (범위 초과) |
3. 구현 예시
3.1 부동소수점 경계값 테스트
class BoundaryValueTest : public ConditionNodeTest
{
protected:
static constexpr double THRESHOLD = 5.0;
static constexpr double EPSILON = 1e-9;
};
TEST_F(BoundaryValueTest, JustBelowThreshold)
{
publishValue(THRESHOLD - EPSILON);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::FAILURE);
}
TEST_F(BoundaryValueTest, ExactlyAtThreshold)
{
publishValue(THRESHOLD);
// > 비교의 경우 FAILURE, >= 비교의 경우 SUCCESS
auto status = tree_.tickOnce();
// 구현에 따라 검증
}
TEST_F(BoundaryValueTest, JustAboveThreshold)
{
publishValue(THRESHOLD + EPSILON);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
}
3.2 정수 경계값 테스트
TEST_F(IntBoundaryTest, ThresholdMinusOne)
{
publishIntValue(THRESHOLD - 1);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::FAILURE);
}
TEST_F(IntBoundaryTest, ExactThreshold)
{
publishIntValue(THRESHOLD);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
}
TEST_F(IntBoundaryTest, ThresholdPlusOne)
{
publishIntValue(THRESHOLD + 1);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
}
3.3 범위 경계값 테스트
TEST_F(RangeBoundaryTest, BelowMinimum)
{
publishValue(MIN_VALUE - EPSILON);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::FAILURE);
}
TEST_F(RangeBoundaryTest, AtMinimum)
{
publishValue(MIN_VALUE);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
}
TEST_F(RangeBoundaryTest, AtMaximum)
{
publishValue(MAX_VALUE);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
}
TEST_F(RangeBoundaryTest, AboveMaximum)
{
publishValue(MAX_VALUE + EPSILON);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::FAILURE);
}
4. 특수 경계값
4.1 영(Zero) 경계
| 테스트 포인트 | 설명 |
|---|---|
| +0.0 | 양의 영 |
| -0.0 | 음의 영 |
| \epsilon | 매우 작은 양수 |
| -\epsilon | 매우 작은 음수 |
4.2 부동소수점 특수 값
| 값 | 테스트 목적 |
|---|---|
std::numeric_limits<double>::max() | 최대값 처리 |
std::numeric_limits<double>::min() | 최소 양수값 처리 |
-std::numeric_limits<double>::max() | 최소값 처리 |
NaN | 무효 값 처리 |
±Inf | 무한대 처리 |
5. 히스테리시스 경계값 테스트
히스테리시스가 적용된 조건 노드에서는 상승 임계값과 하강 임계값 각각에 대한 경계값 테스트가 필요하다.
TEST_F(HysteresisTest, TransitionToFailureAtDangerThreshold)
{
// 안전 상태에서 시작
publishValue(SAFE_VALUE);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
// 위험 임계값 도달
publishValue(DANGER_THRESHOLD);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::FAILURE);
}
TEST_F(HysteresisTest, NoRecoveryBetweenThresholds)
{
// 위험 상태에서 시작
publishValue(DANGER_THRESHOLD);
tree_.tickOnce(); // FAILURE
// 두 임계값 사이 (히스테리시스 대역)
publishValue((DANGER_THRESHOLD + SAFE_THRESHOLD) / 2.0);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::FAILURE);
// 아직 복구되지 않음
}
TEST_F(HysteresisTest, RecoveryAtSafeThreshold)
{
// 위험 상태에서 안전 임계값 도달
publishValue(SAFE_THRESHOLD);
EXPECT_EQ(tree_.tickOnce(), BT::NodeStatus::SUCCESS);
}
6. 설계 시 고려 사항
6.1 부동소수점 비교의 정밀도
double 타입의 연산에서는 반올림 오차가 누적될 수 있다. 경계값 테스트에서 c + \epsilon이 실제로 c보다 큰 값으로 표현되는지를 std::nextafter() 함수를 사용하여 보장할 수 있다.
double just_above = std::nextafter(THRESHOLD,
std::numeric_limits<double>::max());
6.2 테스트 커버리지
경계값 테스트는 모든 비교 연산의 경계에서 수행되어야 한다. 단일 임계값 비교에는 최소 3개(아래, 동일, 위), 범위 비교에는 최소 5개의 테스트 포인트가 필요하다.
7. 참고 문헌
- Myers, G. J., Sandler, C., & Badgett, T. (2011). The Art of Software Testing. Wiley.
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Google Test 문서. https://google.github.io/googletest/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |