jtwjs Dev Wiki
  • DEV_ROAD
    • 💪🏻 생존하기
    • Week 1
      • 개발 환경 세팅
      • 타입스크립트
      • 리엑트
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • 개발하기 전 준비
      • 상품 목록 페이지
      • 상품 상세 페이지
      • 장바구니 페이지
    • Week 10
      • 로그인
      • 로그아웃
      • 회원가입
      • 주문 목록 & 주문 상세
    • Week 11
      • 배송 정보 입력
      • 포트원 결제 요청
      • 배송 및 결제 정보 전달
    • Week 12
      • 관리자 웹사이트개발시작
  • DEV_NOTE
    • TypeScript
      • 기본적 문법
        • Enum
        • 다형성
          • Untitled
        • 구조적 타이핑
        • 제너릭 타입
        • 컨디셔널 타입
        • 함수 메서드 타이핑
        • infer로 타입스크립트의 추론 직접 활용
        • 재귀 타입
        • 템플릿 리터럴 타입
        • 추가적인 타입 검사 satisfies 연산자
        • 타입스크립트 건망증
        • 원시 자료형에도 브랜딩 기법 사용 가능
        • 타입 좁히기
        • 유용한 타입 만들기
        • 데코레이터 함수
        • 앰비언트 선언도 선언 병합이 된다.
        • 앰비언트 선언도 선언병합이 된다.
    • Testing
      • Unit Testing
      • 단위 테스트의 두 분파
      • 좋은 단위 테스트를 구성하는 4대 요소
      • 테스트 대역과 식별할 수 있는 동작
      • 단위 테스트 스타일
      • 가치 있는 단위 테스트를 위한 리팩토링
      • 통합 테스트
      • Cross Browsing Testing
      • 기능 테스트 종류
      • React Testing Pattern
      • 프론트엔드 테스트 입문
        • 테스트 범위
        • 단위 테스트 검증
        • Mock
        • UI 컴포넌트 테스트
        • 테스트 커버리지
        • 웹 통합 테스트
        • MSW
        • 스토리북
        • 시각적 회귀 테스트
        • E2E 테스트
        • Github Actions 설정
        • 깃허브 액션에서 E2E
      • 시프트 레프트
        • 테스트 기본중의 기본
        • 단위 테스트
        • 코드 복잡도
        • 리팩터링
        • 코드 리뷰
        • 통합 테스트 패턴
        • 시스템 테스트의 자동화
        • 탐색적 테스트
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • 함수형 프로그래밍
      • 참조 투명성
      • 부수효과
      • 함수 합성
      • 제너릭 타입 활용하기
      • 암묵적 입출력
      • 액션과 계산, 데이터
      • 계층형 설계
      • 호출 그래프
      • 함수형 설계
      • 불변성
      • 일급 함수
      • 함수형 도구
    • Git
      • Github Actions
      • Conflict
      • Branch 전략
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • 벡터의 연산
        • 회전 계산
      • 3D 컨텐츠가 만들어지는 과정
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • 접근성이란
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • 클라우드 컴퓨팅
        • 온프레미스와 클라우드
        • 클라우드 도입효과
        • 클라우드 컴퓨팅의 범위
        • 컴퓨팅 옵션
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • 네트워크 가상화
        • 스토리지
        • 데이터베이스
        • 데이터 수집
        • 머신 러닝 영역
        • IoT 영역
        • 블록체인 영역
      • 클라우드 아키텍처 설계
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • 의존성을 배제한 개발
      • Error Handling
      • Architecture
        • 모노로틱 아키텍처
        • Clean Architecture
        • Layered Architecture
        • 이벤트 기반 아키텍처
      • 상황을 파악하는 메타인지
      • 중복 문제 해결하기
      • Monorepo Arhitecture
        • 모노레포 운영과 트러블슈팅
        • Module Federation
      • 코드 병목지점
      • API 대응
      • 공통 코드
      • Infra 구축
      • 모듈 기반의 개발 방식
      • Design System
        • 최소 수준의 아키텍처 설정
        • 더 효율적인 디자인시스템 만들기
        • 디자인 시스템과 UI 라이브러리 목적
        • 디자인 토큰
      • 효율적인 업무
        • 업무 프로세스 병목 파악
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • 데코레이터 패턴
        • 커맨드 패턴
        • 전략 패턴
        • 옵저버 패턴
      • A/B 테스팅
      • 대규모 리엑트 웹앱 개발
        • 복잡성 관리
        • 모듈성
        • 성능
        • 디자인 시스템
        • 데이터 패칭
        • 상태 관리
        • 국제화
        • 코드 조직화하기
        • 개인화 A/B 테스팅
        • 확장 가능한 웹 아키텍처
        • 테스팅
        • 툴링
        • 기술적 마이그레이션
        • 타입스크립트
        • 라우팅
        • 사용자 중심 API 디자인
        • 리액트 미래
    • Performance
      • React DevTools
      • Component 최적화
      • Page Load
      • API
    • MFA
      • MSA
      • MFA 도입하기
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA 통합
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • 분해와 통합을 위한 여러 기술 비교
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • 리팩토링 깊게 들여다보기
      • 긴 코드 조각내기
      • 타입 코드 처리하기
      • 유사한 코드 융합하기
      • 데이터 보호
      • 코드 추가 및 제거
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • 커스텀 훅
      • 코드 분할하기 with Suspense, lazy
      • Suspense와 이미지 적재하기
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • 테스트 범위
  • 테스트 목적
  • 테스트 전략 모델
  • 아이스크리미 콘 (역 피라미드)
  • 테스트 피라미드
  • 테스팅 트로피
  • 테스트 전략 계획
  • 테스트가 없어 리팩터링이 불안한 경우
  • 반응형으로 제작된 프로젝트
  • 데이터베이스를 포함한 E2E 테스트가 필요한 경우
  • 주의사항
  1. DEV_NOTE
  2. Testing
  3. 프론트엔드 테스트 입문

테스트 범위

테스트 범위

웹 애플리케이션은 여러 모듈을 조합해 만든다.

  • 한 가지 기능을 구현할 때 구성되는 모듈들

    • 1.라이브러리가 제공하는 함수

    • 2.로직을 담당하는 함수

    • 3.UI 관련 함수

    • 4.웹 API 클라이언트

    • 5.API 서버

    • 6.데이터베이스 서버

  • 테스트를 작성할 때는 어디부터 어디까지 커버하는 테스트인지 주의해야 한다.

  • 테스트 범위는 크게 네가지로 분류된다.

정적 분석

  • 타입스크립트나 ESLint가 제공하는 기능을 활용

  • 각 모듈 내부의 검증뿐만아니라 (2.로직을 담당하는 함수 ~ 3.UI 관련함수 검증), (3.UI 관련함수 검증 ~ 4.웹 API 클라이언트) 검증처럼 인접 모듈을 연계해 사용할 때의 문제점도 검증한다.

단위 테스트

  • 한 가지 모듈에 한정하여 해당 모듈이 제공하는 기능을 검증하는 가장 기초적인 테스트

  • 독립된 환경에서 검증하기 때문에 실제 애플리케이션을 사용할 때는 거의 발생하지 않는 케이스*(코너 케이스)검증에 적합

    • 코너케이스에 한해서만 예외를 발생시키는 것이 나은 경우도 있다.

    • 어떤 상황에서 예외를 발생시켜야 할지 판단할 때 도움이 된다.

    • '이런 상황은 일어날 수 없을까? 일어날 수 있다면 어떻게 처리해야 하는가'와 같은 거듭된 검토 과정에서 미처 고려하지 못했던 부분을 발견할 수 있다.

    • ex: 다른 입력 패턴은 없나?, 예외처리는 충분한가..?

  • 테스트할 모듈이 특정 입력값을 받아 기대하는 출력값을 반환하는지 테스트

  • UI 컴포넌트는 입력값(props)에 알맞은 출력값(HTML 블록)을 반환하기 때문에 일반적인 함수와 같은 방법으로 테스트할 수 있다.

  • 단위 테스트로 함수가 고려하지 못한 부분이 없는지 검증

통합 테스트

  • 여러 모듈을 연동한 기능을 테스트

  • 1.라이브러리가 제공하는 함수 ~ 4.웹 API 클라이언트, 2.로직을 담당하는 함수 ~ 3.UI 관련 함수 처럼 모듈 조합으로 제공되는 기능을 검증하는 테스트

  • 범위가 넓어질수록 효율적인 테스트가 가능하지만 상대적으로 대략적인 검증에 그치게 된다.

  • 커다란 UI 컴포넌트는 여러 모듈을 조합해 기능을 제공하며, 기능은 주로 인터렉션에서 시작된다.

    • 셀렉트 박스 조작 *(인터렉션)

    • URL 검색 쿼리 변경됨

    • 검색 쿼리가 변경되어 데이터 취득 API 호출됨

    • 목록 화면 내용 갱신

    • 즉, 셀렉트 박스 조작을 실행하면 목록 화면 내용도 갱신된다.를 테스트 하는 것

  • 코너 케이스 때문에 테스트가 복잡해지면 범위를 좁혀서 통합 테스트를 실시해야 테스트 목적이 명확해진다.

E2E 테스트

  • UI 테스트 뿐만 아니라 외부 스토리지와 같이 연동 중인 하위 시스템을 포함하는 테스트

  • 1.라이브러리가 제공하는 함수 ~ 4.웹 API 클라이언트 검증을 통틀어 헤드리스 브라우저와 UI 자동화 도구를 결합하여 검증하는 테스트

  • 가장 광범위한 통합 테스트

  • 실제로 애플리케이션을 사용할 때와 가장 유사한 테스트

  • 입력 내용에 따라 저장된 값이 갱신되기 때문에 UI는 물론 연동된 외부 기능이 정상적으로 작동하는지 검증할 수 있다.

테스트 목적

  • 테스트 타입은 테스트 목적에 따라 분류됨

  • 테스트 분야에서 많이 알려진 테스트 타입은 기능 테스트, 비기능 테스트, 화이트 박스 테스트, 회귀 테스트 등이 있다.

  • 테스트 타입은 검증 목적에 맞게 설정해야 하며, 테스트 타입마다 적절한 테스트 도구가 있다.

기능 테스트 (인터렉션 테스트)

  • 개발된 기능에 문제가 없는지 검증하는 테스트

  • 웹 프론트엔드의 대부분 기능은 UI 컴포넌트 조각(인터렉션)에서 시작되기 때문에 주로 인터렉션 테스트가 기능 테스트가 될 때가 많고 중요하다.

    • 웹 프런트는 사용자가 조작할 UI 컴포넌트를 개발하기 때문에 인터렉션 테스트가 대부분

  • 실제 브라우저 API를 사용하는 것이 중요한 테스트라면 헤드리스 브라우저와 UI 자동화 도구를 사용하는 것이 좋음

  • UI 컴포넌트에는 브라우저 없이도 테스트할 수 있는 가상 브라우저 환경이 있음

실제 브라우저가 없어도 가능한 인터렉션 테스트 사례

  • 버튼을 클릭하면 콜백 함수 호출됨

  • 문자를 입력하면 전송 버튼이 활성화됨

  • 로그아웃 버튼을 클릭하면 로그인 화면으로 이동함

*But 가상 브라우저만으로는 스크롤이나 세션 스토리지같은 기능은 테스트할 수 없다. 실제 브라우저가 없으면 수행하기 어려운 기능의 테스트는 헤드리스 브라우저와 UI 자동화 도구를 사용한다.

실제 브라우저가 필요한 인터렉션 테스트 사례

  • 맨 아래까지 스크롤을 내리면 추가 데이터를 가져온다.

  • 세션 스토리지에 저장된 값을 불러온다.

비기능 테스트(접근성 테스트)

  • 접근성 테스트는 비기능 테스트의 한 종류

  • 신체적, 정신적 차별없이 동등하게 제품을 사용할 수 있는지 검증하는 테스트

  • 최근 전 세계적으로 웹 접근성 관련 API가 여러 플랫폼에 추가되어 테스트 자동화를 할 때 객관적으로 검증할 수 있는 환경이 갖추어짐

  • 마찬가지로 접근성 테스트는 기능 테스트와 동일하게 가상 브라우저와 실제 브라우저를 사용하여 테스트 진행

    • 같은 도구를 사용하면 기능 테스트의 초보자가 접근성 품질을 높이는 출발점으로 삼는데 도움됨

접근성 테스트 실제 사례

  • (키보드로) 체크 박스를 체크할 수 있다.

  • 오류 응답을 받았을 때 오류 문구를 렌더링한다.

  • 렌더링된 화면에 접근성 위반사례가 있는지 검사한다.

(시각적) 회귀 테스트

  • 특정 시점을 기준으로 전후 차이를 비교하여 문제가 있는지 검증하는 테스트

  • 웹 프론트엔드는 시각적으로 보이는 UI 컴포넌트를 개발하기에 시각적 회귀 테스트가 중요하다.

  • CSS(종속형 시트)는 UI 컴포넌트에 정의된 스타일뿐만 아니라 브라우저에 적용된 모든 스타일의 영향을 받는다.

  • 회귀 테스트 중 하나인 시각적 회귀 테스트에서는 헤드리스 브라우저에 그려진 내용을 캡처하여 캡처된 이미지 간 차이를 검증한다.

    • 초기에 렌더링된 상태만 캡처하여 비교하는 것에 그치지 않고 사용자 조작으로 변경된 화면까지 캡처하여 비교

시각적 회귀 테스트 사례

  • 버튼 스타일에 차이가 없다.

  • 메뉴 바를 열었을 때 화면에 차이가 없다.

  • 렌더링된 화면에 차이가 없다.

테스트 전략 모델

  • 단위테스트 < 통합 테스트 < E2E 테스트

    • 낮은 유사성, 짧은 실행시간, 높은 안정성 <<< 높은 유사성, 긴 실행시간, 낮은 안정성

  • 상층부 테스트는 많은 시간과 비용이 발생한다.

    • 테스트용 데이터베이스 서버 구축 및 실제 환경과 최대한 유사한 환경을 구축해야 한다.

    • 테스트할 때마다 제품과 연동된 외부 시스템의 응답도 기다려야 하기에 다른 테스트보다 긴 실행 시간이 걸린다.

  • 테스트 계층 간 비용 분배는 테스트 전략을 세울 때 가장 중요한 검토 사항이다.

아이스크리미 콘 (역 피라미드)

  • 상층부 테스트의 비중이 높은 아이스크림 콘은 안티패턴으로 자주 언급되는 테스트 전략 모델이다.

  • 운용 비용이 높을 뿐만 아니라 외부 모듈의 의존성 때문에 아주 가끔식 실패하는 불안정한 테스트가 비교적 많다.

  • 만약 모든 테스트가 통과되는데 수십 분이 상이 걸리면 개발 흐름에 나쁜 영향을 주게 되며 더 나은 개발 환경을 만들고자 테스트를 자동화한 것이 오히려 개발 경험을 해치는 상황이 발생한다.

    • 그러나 실행 시간을 줄이려고 실행 빈도를 줄이면 테스트 자동화의 신뢰성은 낮아진다.

테스트 피라미드

  • 하층부 테스트의 비중이 높을수록 더욱 안정적이고 가성비 높은 테스트가 가능하다는 것이 핵심

  • 하층부는 실행 시간이 짤방 신속성이 높고, 자주실행할 수 있어서 안정성도 높다.

  • 프론트엔드 테스트 자동화에도 테스트 피라미드가 우수한 전략이라는 의견이 지배적

테스팅 트로피

  • 켄트 도즈(Kent C Dodds)가 만든 테스트 전략 모델

  • 통합 테스트 비중이 가장 높아야 한다는 것이 핵심

  • 프론트엔드 개발에서 단일 UI 컴포넌트로 구현되는 기능은 거의 없다.

  • 테스팅 트로피에는 사용자 조작을 기점으로 한 통합 테스트 비중이 높을수록 더욱 우수한 테스트 전략이라는 의도가 있음

  • 테스팅 라이브러리와 제스트를 사용하면 헤드리스 브라우저 없이도 사용자 조작을 재현해 테스트할 수 있어서 실행 속도가 빠르면서도 실제 제품과 유사한 테스트가 가능하다.

테스트 전략 계획

테스트 전략 모델을 참고해 프로젝트에 최적인 전략을 수립하려면 테스트 대상 및 목적에 따른 판단 기준을 정립해야 한다.

테스트가 없어 리팩터링이 불안한 경우

  • 릴리즈된 프로젝트에 테스트 코드가 없으면 리팩터링이 불안할 수 있다.

  • 이때는 먼저 릴리즈된 기능을 목록으로 정리해야 한다.

  • 정리가 됐다면 변경 전후로 결함이 발생하지 않았는지 검증하는 회귀 테스트를 작성해야 한다.

  • 작성된 회귀 테스트가 있다면 자신있게 리팩터링을 시작할 수 있다.

  • 웹 API 서버에 대한 의존성이 깔끔하게 분리되지 않았다면 테스트 작성이 어렵다.

    • 이 때 목 서버를 활용하여 통합 테스트를 실시한다.

    • 목 서버를 활용하면 구현 코드를 수정하지 않아도 테스트할 수 있어 리팩터링 시작전에 테스트를 작성하고 싶은 개발자에게 유용하다. * 특히 릴리즈된 프로젝트에서 효과적

  • 통합 테스트가 늘어날수록 안심하고 리팩터링할 수 있는 기능이 많아진다.

  • 점진적으로 테스트를 늘리면서 리팩터링을 실시하면 더욱 안정된 테스트 피라미드 모델을 만들 수 있다.

반응형으로 제작된 프로젝트

  • 반응형 웹은 하나의 HTML에서 다양한 디바이스에 알맞은 화면을 제공한다.

  • 반응형 웹은 테스팅 라이브러리만으로는 스타일을 포함한 세밀한 테스트가 어렵다.

  • 반응형처럼 디바이스 간 서로 다른 스타일을 제공하는 경우, CSS가 적용된 렌더링 결과를 검증할 브라우저 테스트가 필요함

    • 이런 상황에서 실시하는 테스트가 브라우저를 사용한 시각적 회귀 테스트

  • 스토리북은 UI 컴포넌트 단위로 시각적 회귀 테스트가 가능하다.

  • 반응형으로 프로젝트를 제작해야 한다면 스토리북을 사용해서 테스트를 작성하는 것이 효율적

    • Storybook -> reg-suit를 활용한 시각적 회귀 테스트

데이터베이스를 포함한 E2E 테스트가 필요한 경우

  • 목서버가 아닌 실제 웹 API 서버를 사용해서 E2E 테스트를 하고싶다면 테스트용 스테이징 환경을 사용해야 한다.

    • 스테이징 환경이란 실제로 배포할 환경에 가까운 형태로 만든 테스트용 환경을 의미

  • E2E 테스트는 테스트 엔지니어가 프로젝트를 릴리즈하기 전에 테스트 계획서를 보면서 수동으로 하는 경우가 많고, 브라우저를 사용한 UI 자동화 방식으로 테스트하는 경우도 있다.

    • 브라우저를 사용한 UI 자동화는 아이스크림 콘 모델에 가까운 테스트 전략이 되기 쉽다.

    • 명확한 목적을 가지고 더욱 작은 범위의 테스트로도 괜찮은지 먼저 검증해야 한다.

스테이징 환경을 만들지 않고 개발자 혼자서 실시할 수있는 테스트 자동화 방법 with 도커 컴포즈

  • 테스트할 시스템을 컨테이너화해 CI 환경에서 실행한 후 연동중인 여러 시스템과 함께 테스트 하는것

  • 비교적 환경 구축 비용이 적고 개발자 혼자서도 구축할 수 있는 장점이 있다

  • 컨테이너를 활용해 테스트하려면 E2E 테스트 프레임워크의 사용법 및 컨테이너 가상화 지식, 연관 시스템 설정 지식이 필요

주의사항

  • 테스트를 너무 많이 작성하고 있는지 되돌아보기

  • 테스트 타입 및 전략은 무수히 많고 여러 종류의 테스트를 작성하다 보면 테스트 범위가 중복되는 것을 발견할 수 있다.

  • 스토리북이나 E2E 테스트가 중요한 프로젝트라면 UI 컴포넌트 테스트는 오류 패턴을 검증하는 것으로 충분하다는 결정을 내릴수도 있다.

  • 테스트 범위 중복은 테스트를 활발히 작성하는 시기에 발견된다.

  • 이전에 기능을 개발하기 위해 작성된 테스트 규모는 새 기능을 개발할 때 어느정도로 테스트를 작성해야 하는지 결정하는 참고 지표로 활용된다.

    • 이 참고 지표는 팀에 일정 규모 이상의 테스트를 작성하도록 유도한다.

  • 지나치게 많이 작성한 테스트를 발견했다면 과감하게 줄이자.

  • 프로젝트에 알맞은 기술 구성은 무엇이며 어떤 테스트 전략이 프로젝트에 적합한지 항상 되돌아보자.

Previous프론트엔드 테스트 입문Next단위 테스트 검증

Last updated 10 months ago