유닛 테스트 조사

3 분 소요

개발자 테스트 활동

단위테스트

개발자가 작성, 개발자가 작성하는코드를 개발자들이 어떻게 가정하는지 검증하는 쉽고 빠르면서도 가장 일관된 방법.

개발자는 설계한대로 코드를 작성하기전에 테스트를 작성하거나 코드작성후 코드가 예상대로 동작하는지 검증하기위해서 테스트를 작성

지속적인 통합 CI: Continuous Integration

코드를 자주 통합하고 항상 메인 빌드를 안정상태로 유지하는 실천법

기술적 관점과 인프라적 관점으로 구성됨

  • 버전 관리 시스템의 임의의 변경사항을 커밋하기전에 개발자는 최신버전의 빌드를 가져와 자신의 로컬 변경사항과 병합하고 개발자 머신에서 테스트 스위트를 수행
  • 모든 테스트가 통과되면 개발자는 새로운 코드를 버전관리 시스템에 커밋, 빌드서버가 변경사항을 알게되면 최신버전의 코드를 가져와 컴파일하고 단위테스트를 수행 → 이것이 지속적인 통합을 시작한 팀이 수행하는 지속적 통합의 핵심

테스트 자동화

기술에 익숙하지 않은 사용자가 읽을수 있도록 작성해야함

단위테스팅

단위테스트란 다음과 같은 특성을 지님

  • 완전히 자동화됨: 수동으로 실행되는 드라이버 프로그램은 단위 테스트가 아님
  • 스스로 검증: 코드만 실행하는 것이아니라 코드가 예상대로 동작하고 결과를 전달하는지 검증
  • 반복가능하며 일관적: 매번 실행할때마다 동일한 입력을 제공하면 동일 결과를 기대가능
  • 단일 논리개념을 테스트: 테스트되는 코드에 대해 하나의 단위테스트는 한가지만 검증해야함
  • 격리돼 실행됨: 다음과 같은 테스트는 단위테스트가 아님
  • 데이터베이스와 연동한다
  • 네트워크를 통해 통신한다
  • 파일 시스템을 이용한다
  • 다른 단위 테스트와 동시에 실행할 수 없다
  • 테스트를 실행하기 위해 환경에 특별한 작업을 수행해야 한다
  • 빠르다

단위 테스트는 하나의 구체적인 기능의 일부를 검증해야하며 특정한 한가지 이유로 실패해야 함


단위 테스트는 왜하는가

  • 확장을 가능하게함
  • 더 나은 설계를 유도함 테스트를 통해 단위 작업을 시험한다면 이들은 작업단위를 더 작고 간결하게 만드는 경향이 있으며 작업단위의 의존성을 생각하면서 작업을 가능하게됨. 즉 다음과 같은 상황에서 코드를 구제 가능
  • 매개변수가 너무많은 메소드
  • 몬스터 메소드
  • (정적 클래스와 싱글톤에서의)전역적 상태
  • 과도한 의존성
  • 부작용
  • 변경을 가능하게만듬
  • 회귀를 방지함
  • 꾸준한 작업속도를 제공
  • 테스트 시간을 확보
  • 행위를 지정하고 코드를 문서화

테스트 고려사항

고수준 고려사항

테스트 효과

시스템의 상태에 따라 특정 유형의 테스트가 다른 유형의 테스트보다 효과적일수 있다

  • 단위테스트

테스트 주도개발의 실행 여부와 상관없이 새로운 코드를 전문적으로 작성해야한다. 즉 단위테스트는 미래에 다른 사람들이 유지보수 할 수 있는 방식으로 작성 되는 것과 관련이 있다. 단위 테스트는 코드가 테스트 가능하고 이들의 명세가 제공되는 것을 보장

  • 컴포넌트/서비스 테스트

책임이 잘 정의된 분리 가능한 컴포넌트들을 가진 시스템에서 지속성 메커니즘에 대한 정확성을 포함해 많은 기능들을 다룸

  • 종단 간 테스트나 시스템 테스트

단위 테스트를 수행하기 어렵거나 시간을 소모하는 컴포넌트 구별이 어려운 난해한 코드를 가진 오래된 시스템을 다루는 경우 중요한 기능에 대한 커버리지를 제공하고 곧바로 퇴행 요소를 처리함


테스트 레시피

테스트 해야 할 항목의 선택에 도움이 되며 단위 테스트로 작업하는 경우에 특히 유용

  • 레시피1
    • 해피패스 테스트
    • 대안경로 테스트
    • 오류경로 테스트
    • 테스트 데이터의 치환
      • 경계 조건
      • 데이터 기반 실행
      • 런타임과 동적바인딩
      • 결함테스트
  • 레시피2 - Right BICEP
    • 결과가 올바른가
    • 경계조건
    • 역관계
    • 다양한 사실에 대한 소스를 사용한 교차검사
    • 오류조건
    • 성능특성
  • 레시피3 - 본인이 코드를 작성한경우
    • 조건
    • 루프
    • 동작
    • 다형성

추상화 수준과 세부사항

단위 테스트

다양한 입력의 변동, 경계 값, 데이터 주도 테스팅, 입력검증 ,철저한 분기 커버리지 같은 저수준 기법들을 다뤄야함. 이 테스트 들은 테스트 코드에 기술적 용어를 사용할수 있지만 사용자 관점에서 의미있는 동작을 테스트해야

시스템 테스트 혹은 종단간 테스트

더 큰 그림을 살펴보고 시스템이 전체적으로 동작하는지 확인해야 함. 이 테스트들은 세부 사항 및 변형과 관련되면 안된다. 이들은 시나리오나 유스케이스를 포함해야하며 비즈니스 언어를 사용해야함


사실에 대한 소스

  • 테스트의 결과가 올바르다는 사실을 어떻게 알수 있는가
    • 단일 값 - 오직 하나의 값만이 올바른 정답이다.
    • 범위 - 올바른 값이 알려진 범위나 간격내에 있다
    • 세트 - 올바른 값이 여러개있으며 이들은 유한한 크기의 집합에 해당한다
    • 서술 - 해당값이 올바른지는 Yes나 No를 말하는 함수에 의해 결정된다
    • 교차점검 - 값이 올바른지 결정하기 위해 대안적인 구현이 사용된다
    • 역기능 - 테스트된 코드가 생성된 결과에 대한 역함수를 적용해 입력을 생성한다

저수준의 고려사항

Zero-one-many

테스트가 다음과 같은 사항을 다루는지 확인

  • 0개사례
  • 1개사례
  • 다중사례

Nulls

타입 배열 컬렉션이 null/undefind를 허용하는 경우 항상 무슨 일이 일어나는지 확인해라

범위

m~n의 범위에 대해 다음값에서의 동작을 확인해야

  • m-1
  • m
  • n
  • n+1

컬렉션

다음과 같은 경우를 고려해야

  • 하나의 요소를 갖는경우
  • 여러개의 요소를 갖는경우
  • 중복된 요소들이 포함된 경우
  • 요소들의 대안적순서

예외 및 오류

다음과 같은 사항을 생각해야

  • 예외 타입(클래스)
  • 예외메시지
  • 중첩예외
  • 다른예외 매개변수
  • 모든 오류코드 점검

숫자

다음과 같은 사항에 유의하라

  • 0
  • 음수
  • 기본 타입에 대한 오버플로우
  • 부동소수점 정밀도
  • 다른표현
  • 파싱을 위해 문자열로 표시되는 경우 쉼표,마침표,공백

문자열

다음 사항을 고려

  • 빈문자열
  • 하나의 공백문자
  • 여러개의 공백문자
  • \n,\r,\t 등과 같은 특수문자
  • HTML엔티티
  • ASCII문자가 아닌경우
  • 인코딩
  • 고정크기 문자열의 버퍼의 오버플로우

날짜

다음 사항에 유의

  • 다양한 형식
  • 각 월의 일 수
  • 윤년
  • 시간대
  • 일광절약시간
  • 정확성(날짜가 시간 컴포넌트를 갖는가)
  • 타임 스탬프 형식