본문 바로가기
Develop/Etc

테스트 커버리지? 개발하기 전에 테스트?

by bellsilver7 2022. 3. 29.
728x90

  "테스트 커버리지 100" 이라는 주제의 토스 컨퍼런스 영상을 보게 되면서 커버리지가 무엇인지 궁금해져 요 며칠 찾아본 자료를 정리해보고 그러면서 함께 보게된 TDD 라는 것에 대해서 기록해보려 한다. 그리고 내가 현재 사용하고 있는 PHP 언어로는 어떻게 테스트 할 수 있는지까지 말이다.

 

테스트를 왜 해야하는가?

  시작하기 앞서 우리가 열심히 작성한 코드가 있다고 해보자. 이 코드가 제대로 구현 했는지 검증하기 위해서는 테스트를 해야 한다. 요구사항을 빠르게 개발하는 것도 중요하겠지만 자신감 있고 여유있는 개발자가 되기 위해서는 우리가 만든 기능에 해당하는 테스트를 작성하는 것도 중요한 역량중 하나라고 할 수 있겠다. 이제 테스트의 중요성에 대해서도 한 번 짚어봤으니 테스트 커버리지에 대해 알아보겠다.

 

테스트 커버리지

  먼저 커버리지란 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표

라고 할 수 있겠다.

 

  위의 그림이 쉬워 보이는 듯 하면서도 약간은 헷갈리고 어렵게도 느껴지지만 내가 정리해 본 바는 다음과 같다.

 

- 구문 커버리지: 조건문이 있다고 가정했을 때 조건문 내 구문- 결정 커버리지: 코드내 조건문의 true/false- 조건 커버리지: 조건문 내의 모든 조건들의 true/false- 조건/결정 커버리지: 결정에 따른 모든 조건들의 true/false- 변경 조건/결정은 커버리지: 조건/결정에서 개별조건에 관계 없이 전체조건식의 결과에 독립적인 경우의 수- 다중조건 커버리지: 모든 경우의 수

 

를 실행해보는 것이다. 자세한 내용은 아래 동영상을 참고해보면 좋을 것 같다.

 

정보처리기사 테스트 커버리지

 

 

  다시 말해 테스트 커버리지는 위와 같은 유형들을 사용해 만든 테스트 케이스들을 실행해 나온 적합률이라고 정의해 보았다. 그렇다면 테스트 커버리지는 이제 알겠는데 테스트 커버리지는 이제 약간 알겠는데 어떻게 테스트 할 수 있겠는가? 그것을 확인해보기 전에 TDD 라는 용어에 대해 잠시 정리해보고 넘어가겠다.

 

TDD(Test Driven Development)

 

  가끔 표현은 들어봤지만 이러한 방법론을 적용해본 사례가 없어 생소했고 말 그대로 테스트 주도 개발이라 정의할 수 있다.

  프로그램을 개발하기 위한 요구사항들이 있다면 먼저 요구사항에 맞는 1. 특정 기능에 대한 테스트 케이스를 작성하고 이것을 2. 실행하면 당연히 실패할 것이다. 그럼 3. 테스트가 성공할 수 있도록 코드를 작성하며 4. 작성된 코드의 테스트를 다시 실행하여 실패(FAIL)하면 리팩토링하여 성공(PASS)이 될 때까지 이 과정을 반복하고 다른 기능에 대한 테스트 케이스 작성으로 넘어가는 테스트 방법론이라 할 수 있다.

 

Laravel Testing

  다시 돌아와 현재 내가 사용하고 있는 언어인 PHP 에는 테스트를 도와주는 PHPUnit 이라는 단위 테스트 도구가 있다. 그리고 이는 Laravel 프레임워크에 통합되어 있음을 알게 되어 간단히 test 코드를 작성하고 실행해 보았다.

 

테스트를 시작하기 위해서는 phpunit을 실행해야 하며 이는 .\vendor\bin 디렉토리 하위에 존재하며 .\vendor\bin\phpunit 을 입력하여 테스트를 실행해 볼 수 있고 이는 php artisan test 라는 명령으로 실행해 볼 수 있다.

 

artiasan 으로 실했했을 때는 이렇게 PASS 라는 문구와 테스트 클래스 그밑에 함수들이 나열되어 몇 개의 pass와 몇 개의 fail 이 발생했는지 확인해 볼 수 있다. 현재 2개의 테스트 중 모두 패스를 했기에 커버리지가 100%라 말할 수는 있으나 이는 충분한 테스트 케이스를 작성해 실행한 것이 아니기 때문에 이를 통해 알 수 있듯 100%의 테스트 커버리지를 가진 프로그램이 완벽하게 버그가 없다고 할 수는 없다. 하지만 충분한 테스트 케이스로 얻어낸 커버리지는 자신감 있고 여유 넘치는 개발자가 되어 볼 수 있을 것이라 생각된다.

 

PHPUnit 이나 laravel test 를 생성하는 방법에 대해서는 다음번에 다뤄보도록 하고 일단 생략하고 넘어가겠다.

먼저 https://github.com/codewithdary/laravel-testing 를 참고해 환경을 설정하고 테스트 코드를 작성해봤다.

 

public function test_login_form()
{
    $response = $this->get('/login');

    $response->assertStatus(200);
}

public function test_user_duplication()
{
    $user1 = User::make([
        'name' => 'john',
        'email' => 'john@mailaddress.com',
    ]);

    $user2 = User::make([
        'name' => 'pole',
        'email' => 'pole@mailaddress.com',
    ]);

    $this->assertTrue($user1->name != $user2->name);
}

public function test_delete_user()
{
    $user = User::factory()->count(1)->make();

    $user = User::first();

    if ($user) {
        $user->delete();
    }

    $this->assertTrue(true);
}

public function test_it_stores_new_users()
{
    $response = $this->post('/register', [
        'name' => 'bellsilver7a',
        'email' => 'bellsilver7a@mailaddress.com',
        'password' => 'qlalfqjsgh486',
        'password_confirmation' => 'qlalfqjsgh486',
    ]);

    $response->assertRedirect('/home');
}

위와 같은 코드를 테스트 코드를 작성하고 test 를 실행했더니 방금 만든 케이스들의 통과 여부를 확인해 볼 수 있다.

 

여기까지 내가 조사하고 실습해본 부분에 대해 정리해보았다. 지금까지 TDD 방법론을 적용한 사례도 없었고 테스트 케이스를 코드로 만들어 본적이 없기에 조금은 생소하지만 코드의 퀄리티와 개발에 대한 집중력을 높이고 자부심 있는 코드를 만들기 위해선 필수적인 요소이지 않을까 생각하며 실 업무에도 적용할 수 있도록 준비해야겠다.

728x90

댓글