동등분할(Equivalence Partitioning)과 경계값(boundary value) 테스트

주싱·2022년 10월 14일
0

더 나은 테스트

목록 보기
10/16
post-custom-banner

최근에 배운 동등분할과 경계값 테스트라는 개념을 현업에 적용해 보았다. 동등분할이란, 동일한 결과를 내는 입력들을 하나의 그룹으로 묶어서 입력 그룹의 대표 값을 정해 테스트하는 것을 의미한다. 경계값 테스트를 이어서 적용하면 동등분할로 구분된 각 입력 그룹에서 경계에 있는 값을 테스트하는 것을 의미한다. 안테나의 구동 경로를 최적화하는 로직을 테스트하는 일이었는데 다음과 같은 6가지 케이스를 도출해서 테스트할 수 있었다. 그 동안 이런 방법의 테스트를 안해온 건 아니지만 체계적인 이론을 이해하고 수행해보는 건 처음인 것 같다. 빈틈 없는 테스트 케이스로 검증하고 나니 작성한 코드에 대한 자신감이 생긴다.


static Stream<Arguments> azimuthPathSupplier() {
    // 동등분할 & 경계값 테스트 (같은 결과를 내는 입력들을 하나의 그룹으로 묶고 그룹 내에 경계값을 테스트 한다)
    return Stream.of(
            // 1) 시계방향으로 구동되는 경로
            // 1.1) 0도를 지나지 않는 경로
            arguments(Arrays.asList(new AzimuthTestCase(0.0f, false), // AzimuthTestCase(azimuth, toBeAdjusted)
                                    new AzimuthTestCase(100.f, false),
                                    new AzimuthTestCase(300.f, false))),
            // 1.2) 0도를 지나면서 CW Limit를 지나지 않는 경로
            arguments(Arrays.asList(new AzimuthTestCase(359.5f, false),
                                    new AzimuthTestCase(0.0f, true),
                                    new AzimuthTestCase(clockWiseLimit, true))),
            // 1.3) 0도를 지나면서 CW Limit를 지나는 경로
            arguments(Arrays.asList(new AzimuthTestCase(359.5f, false),
                                    new AzimuthTestCase(clockWiseLimit, true),
                                    new AzimuthTestCase(clockWiseLimit+1, false))),
            // 2) 반시계방향으로 구동되는 경로
            // 2.1) 0도를 지나지 않는 경로
            arguments(Arrays.asList(new AzimuthTestCase(300.0f, false),
                                    new AzimuthTestCase(100.5f, false),
                                    new AzimuthTestCase(0.1f, false))),
            // 2.2) 0도를 지나면서 CCW Limit를 지나지 않는 경로
            arguments(Arrays.asList(new AzimuthTestCase(0.0f, false),
                                    new AzimuthTestCase(359.0f, true),
                                    new AzimuthTestCase(countClockWiseLimit, true))),
            // 2.3) 0도를 지나면서 CCW Limit를 지나는 경로
            arguments(Arrays.asList(new AzimuthTestCase(0.0f, false),
                                    new AzimuthTestCase(359.0f, true),
                                    new AzimuthTestCase(countClockWiseLimit-1, false)))
    );
}

@ParameterizedTest
@MethodSource("azimuthPathSupplier")
void adjust(List<AzimuthTestCase> azimuthPath) {
    // given
    List<Position> inputList = newInputList(azimuthPath);
    List<Position> expectedList = newExpectedList(azimuthPath);

    // when
    List<Position> actualAdjustedList = adjustTrack.work(inputList);

    // then
    assertEqualsPath(expectedList, actualAdjustedList);
}
profile
소프트웨어 엔지니어, 일상
post-custom-banner

0개의 댓글