자신의 코드에 대해서만 테스트 작성

'무엇을 테스트해야 합니까?'에 대한 실제 사례

테스트 작성을 이제 막 시작하는 개발자들은 종종 무엇을 테스트해야 하고 어떻게 '제대로' 테스트해야 하는지에 대해 혼란스러워합니다. 기능 테스트, 단위 테스트, 통합 테스트 및 승인 테스트와 같은 용어는 압도적입니다.

하지만 대부분의 사람들이 생각하는 것보다 쉽습니다. 웹 앱 코드가 예상대로 작동하는지 확인하는 테스트 코드를 작성하기만 하면 됩니다. 그 이상도 그 이하도 아닙니다.

예시



명확하게 하기 위해 예를 들어 보겠습니다. Laravel 로그 항목에 컨텍스트 데이터를 추가하는 Laravel Log Enhancer이라는 오픈 소스 패키지가 있습니다.

기본 Laravel 로그 항목은 다음과 같습니다.



패키지는 다음과 같이 개선합니다.



이 패키지는 222,000회 이상 다운로드되었지만 한 가지 비밀을 말씀드리겠습니다 🤫. 그것은 단지 점들을 연결하고 작은 코드베이스를 가지고 있습니다.

Laravel은 Monolog 라이브러리를 사용하여 로깅 모듈을 관리합니다. 그리고 Monolog는 모든 로그 항목에 대한 추가 데이터를 추가하기 위해 processors이라는 것을 제공합니다.

자, 소개는 여기서 끝내고 몇 가지 코드를 살펴보겠습니다.

foreach ($logger->getHandlers() as $handler) {
    if (config('laravel_log_enhancer.log_request_details')) {
        $handler->pushProcessor(new WebProcessor);
    }

    if (config('laravel_log_enhancer.log_memory_usage')) {
        $handler->pushProcessor(new MemoryUsageProcessor);
    }

    $handler->pushProcessor(new RequestDataProcessor);
}


이 코드 조각은 패키지의 핵심입니다. 구성에 따라 프로세서를 Monolog 핸들러로 푸시합니다. 나머지 작업은 Monolog 라이브러리에서 수행됩니다.

예제에 대한 테스트



이론적으로 우리의 로그 인핸서 패키지는 로그 항목에 추가 데이터를 추가해야 합니다. 따라서 해당 동작을 확인하는 자동화된 테스트를 작성해야 합니다. 오른쪽?

다음과 같아야 하나요?

/** @test */
public function it_adds_extra_data_to_the_log_entries()
{
    // Given
    config(['laravel_log_enhancer.log_memory_usage' => true]);
    config(['laravel_log_enhancer.log_request_details' => true]);

    // When
    // Run the code that logs something

    // Then
    // Fetch the log entry and check whether extra details are present in it
}


아니!!

패키지는 일부 프로세서만 핸들러로 푸시합니다. 최종 로그 항목에 어떤 일이 발생하는지 걱정할 필요가 없습니다. 그 부분을 확인하는 것은 Monolog 테스트의 책임입니다. 말이된다? 좋은.

이러한 이해를 바탕으로 패키지의 실제 테스트 코드를 살펴보겠습니다.

/** @test */
public function it_adds_respective_processors_to_the_log_handler()
{
    config(['laravel_log_enhancer.log_memory_usage' => true]);
    config(['laravel_log_enhancer.log_request_details' => true]);
    $logger = $this->app[Logger::class];

    $handlers = $logger->getHandlers();
    foreach ($handlers as $handler) {
        $this->assertInstanceOf(RequestDataProcessor::class, $handler->popProcessor());
        $this->assertInstanceOf(MemoryUsageProcessor::class, $handler->popProcessor());
        $this->assertInstanceOf(WebProcessor::class, $handler->popProcessor());
    }
}


이 테스트는 패키지가 수행하는 작업을 정확히 확인하고 있습니다. 핸들러에 프로세서를 추가하는 것입니다. 그 이상도 그 이하도 아닙니다.

쉬다



이 예제가 테스트의 경계를 결정하고 테스트 작성에 대한 자신감을 높이는 데 도움이 되기를 바랍니다.

무엇을 테스트해야 하는지 설명하는 다른 예가 있습니까? 자유롭게 의견을 말하고 공유하십시오. 또 봐요!


크레딧 - Paul SkorupskasUnsplash님의 표지 사진

좋은 웹페이지 즐겨찾기