240219 TIL #325 Test / JUnit

김춘복·2024년 2월 18일
0

TIL : Today I Learned

목록 보기
325/543
post-custom-banner

Today I Learned

오늘은 JUnit과 테스트에 대해 한번 정리해보았다.


Test

Bug

소프트웨어가 예상하지 못한 결과를 내는 것. 소스코드나 설계과정에서의 오류 때문에 발생.
테스트 코드를 작성하는 이유는 소프트웨어가 예상한대로 결과를 내는지 모든 상황을 체크하기 위함.

  • 테스트는 논란이 많다. 방법론이나 패턴은 비판을 많이 받고 딱히 정답이랄 것은 없다. 테스트 코드 자체의 유지보수도 신경써야한다. 하지만 방법에 있어서의 논쟁이지 테스트 코드 자체의 효용은 부정할 수 없다. 테스트 코드를 통해 스스로 작성한 코드를 되돌아보면서 구조와 설계, 실제 구현을 고민할 수 있기 때문이다.

  • 배포 전 버그 찾는 방법 - 테스트

  1. 블랙박스 테스팅 : 내부 구조를 모르는 상태에서 웹서비스의 사용자 입장에서 테스트
    누구나 테스트가 가능하지만 기능이 늘어날수록 테스트의 범위가 늘어나고 사람에 따라 테스트의 퀄리티가 다르다. 그래서 주로 QA팀이 Production 환경(실제 서비스 환경)과 유사한 환경(stage)에서 테스팅을 한다.

  2. 개발자 테스트 : 개발자가 본인이 작성한 코드를 검증하기 위해 테스트 코드 작성
    빠르고 정확한 테스트가 가능하고 테스트 자동화가 가능. 배포 절차 시 테스트코드가 수행되어 동작 검증. 리팩토링이나 기능 추가시 편리. 하지만 개발 시간이 오래걸리고 테스트 코드를 유지보수하는 비용 발생


JUnit

단위 테스트(Unit Tests)

프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사. 문제 발생시 어느 부분이 잘못 되어있는지 빠르게 확인 가능.

  • 개발중 -> 단위테스트 -> QA 테스팅 -> Production
    테스트 단계를 위와 같이 나눌 수 있는데 뒤로 갈수록 버그 발견시 비용이 기하급수적으로 커진다.

  • TDD : Test-Driven Development. 테스트코드를 먼저 작성하고 실제 동작하는 코드를 개발하는 순서로 진행하는 개발 방법론. 설계 -> 테스트 -> 개발순.

  • Given - When - Then 패턴
    : 준비 - 실행 - 검증 패턴. 테스트코드를 작성하는 가장 대표적인 방법론. 이렇게 단계별로 테스트 코드를 나눠서 직관적으로 작성 가능.

JUnit

: 자바 프로그래밍 언어용 단위 테스트 프레임워크. 스프링 사용시 build.gradle에 이미 JUnit 사용을 위한 환경설정이 되어 있다.

  • 테스트 파일 생성
    Ctrl+Shift+N으로 파일 찾기 들어가서 해당 파일 선택 후
    마우스 우클릭 -> Generate... -> Test... -> (기본세팅 그대로) OK

  • 테스트 코드
    @Test : 테스트 클래스의 메서드 위에다 달면 메서드가 하나의 테스트 케이스가 된다.
    @DisplayName("케이스 이름") : 메서드 위에 라벨링 해주는 어노테이션
    @BeforeEach : Given부분, 테스트하는데 필요한 부분 미리 준다는 표시
    @Nested : 이걸로 테스트 케이스를 계층구조로 만들 수 있다.
    Given - When - Then 패턴으로 나눠서 코드 짜면 편하다.
    Then에서 assert 함수들로 검증을 하면 된다.
    assertNull(A) : A에 들어가는 인자가 null이어야 테스트 통과
    assertEquals(A,B) : A와 B의 값이 같아야 테스트 통과
    assert 함수들은 외울 필요는 없고 필요시 검색이나 여기서 확인


Edge 케이스를 고려한 단위 테스트

  • 로직 : 테스트 케이스의 단위는 메서드가 아니라 하나의 로직이다.

  • Edge 케이스 : 매개변수의 값이 극단적인 최대값이나 최소값이라 로직에 문제가 발생할 수 있는 경우

  • 만약 userId가 null로 들어온다면? 마이너스라면? URL이 정상적인 형태가 아니라면?

  • 이런 케이스들에 대처하려면 기존 소스를 고쳐야 한다.
    (생성자로 Product 객체를 만들때 edge case들 다 예외처리시킴)
    개발 단계에서 고민되었으면 고칠 필요가 없었으니 설계를 잘 해야 한다.

  • URL 유효성 검사 메서드(여기선 생성자에 사용)

    boolean isValidUrl(String url)
    {
        try {
            new URL(url).toURI();
            return true;
        }
        catch (URISyntaxException exception) {
            return false;
        }
        catch (MalformedURLException exception) {
            return false;
        }
    }
profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글