Golang FuzzTesting : 효과적인 버그 탐지 전략

Divan·2024년 1월 15일
post-thumbnail

fuzz test는 소프트웨어 개발에서 버그, 보안 취약점, 그리고 예외 상황을 찾아내기 위해 무작위 데이터를 사용하는 강력한 테스팅 방법입니다. Go 언어에서 fuzz test는 testing 패키지 를 활용하여 구현할 수 있으며, 특히 복잡한 입력을 다루는 코드나 다양한 상황에서의 예외 처리 로직을 검증하는 데 유용합니다.

1. FuzzTesting의 중요성

유닛 테스트가 놓칠 수 있는 많은 에지 케이스를 포착할 수 있습니다. 이는 특히 사용자 입력, 파일 형식, 네트워크 프로토콜 등의 데이터를 파싱하는 코드에 중요합니다. 무작위 입력을 통해 예상치 못한 버그나 실패를 발견함으로써, 소프트웨어의 안정성과 보안성을 크게 향상시킬 수 있습니다.


2. 일반 예제

Go 언어의 testing 패키지는 fuzz test를 위한 기본적인 기능을 제공합니다. fuze test 는 Fuzz 함수를 사용하여 구현하며, 이 함수는 무작위 데이터를 생성하여 테스트 대상 함수에 전달합니다.

package mypackage

import (
    "testing"
)

func FuzzParseFunction(f *testing.F) {
    testcases := []string{"example", "test", "123"}
    for _, tc := range testcases {
        f.Add(tc) // 초기 테스트 케이스 추가
    }

    f.Fuzz(func(t *testing.T, input string) {
        _, err := ParseFunction(input)
        if err != nil {
            t.Errorf("ParseFunction failed for input %s: %v", input, err)
        }
    })
}

func ParseFunction(input string) (string, error) {
    // 입력 문자열을 파싱하는 로직 구현
    return input, nil
}

이 예제에서 ParseFunction은 입력 문자열을 파싱하는 함수입니다. FuzzParseFunction 퍼즈 테스트는 ParseFunction에 다양한 무작위 입력을 제공하여 예외 상황을 탐지합니다. 또한, 초기 테스트 케이스를 f.Add를 통해 추가하여 기본적인 테스트 케이스로 시작할 수 있습니다.

3. 범위제한 예제

fuzz test를 진행할 때, 입력 값의 범위를 고정하는 것은 F.Fuzz 함수의 기본 동작에 직접적으로 내장된 기능은 없습니다. fuzz test의 기본 목적은 예측할 수 없는 다양한 입력을 생성하여 코드의 견고성을 시험하는 것이기 때문이다. 하지만, 입력 범위를 제한하고 싶은 경우에는 다음과 같이 사용 가능 합니다.

package mypackage

import (
    "testing"
)


// SimpleCalc는 주어진 숫자에 2를 곱하고 10을 더하는 간단한 함수입니다.
func SimpleCalc(x int) int {
    return (x * 2) + 10
}

func FuzzSimpleCalc(f *testing.F) {
    // 초기 테스트 케이스 추가
    f.Add(5)
    f.Add(-3)

    f.Fuzz(func(t *testing.T, x int) {
        // 입력 값이 -10과 10 사이인 경우에만 테스트 실행
        if x >= -10 && x <= 10 {
            result := SimpleCalc(x)
            if result < 0 {
                t.Errorf("SimpleCalc returned a negative result for input %d", x)
            }
        }
    })
}

위 예제는 -10과 10 사이의 숫자에 대해서만 SimpleCalc 함수를 실행합니다. 이러한 방식으로 퍼즈 테스트의 입력 범위를 제한할 수 있습니다.


3. 결론

fuzz test를 실행할 때, Go 테스트 런타임은 지정된 함수에 다양한 무작위 입력을 제공합니다. 테스트 중 발생하는 모든 예외나 실패는 버그의 존재를 나타냅니다. 테스트가 실패하면, 개발자는 해당 입력을 분석하여 코드의 문제를 해결할 수 있습니다.

Go 언어에서의 fuzz test는 소프트웨어 개발의 중요한 부분으로, 코드의 견고함과 신뢰성을 높이는 데 큰 역할을 합니다. 복잡한 시스템을 구축하거나 데이터를 처리하는 애플리케이션을 개발할 때, 퍼즈 테스트는 잠재적인 문제를 사전에 발견하고 해결하는 데 필수적인 도구입니다.

profile
하루 25분의 투자

2개의 댓글

comment-user-thumbnail
2024년 1월 16일

잘 보고 갑니다

답글 달기
comment-user-thumbnail
2024년 1월 16일

^^

답글 달기