Unit Test: 테스트 환경 설정

  • 패키지 설치

    npm i -D jest @vue/test-utils@next vue-jest@next babel-jest
    
  • jest.config.js

    module.exports = {
      moduleFileExtensions: [
        'js',
        'vue'
      ],
      moduleNameMapper: {
        '^~/(.*)$': '<rootDir>/src/$1'
      },
      modulePathIgnorePatterns: [
        '<rootDir>/node_modules',
        '<rootDir>/dist'
      ],
      testURL: 'http://localhost/',
      transform: {
        '^.+\\.vue$': 'vue-jest',
        '^.+\\.js$': 'babel-jest'
      }
    }
    
    • moduleFileExtensions

      파일 확장자를 지정하지 않은 경우 Jest가 검색할 확장자 목록이다.
      일반적으로 많이 사용되는 모듈의 확장자를 지정한다.

    • moduleNameMapper

      틸드(~) 같은 경로 별칭을 매핑한다.
      <rootDir> 토큰을 사용해 루토 경로를 참조할 수 있다.

      '^~/(.*)$': '<rootDir>/src/$1’
      틸드(~/)의 슬래쉬로 시작하는 경로별칭은 뒤쪽에 있는 값으로 매핑한다. 뒤쪽의 값은 <rootDir>은 무시하고 src 디렉토리 안에 있는 모든 경로($1)를 매핑한다는 의미이다.

    • modulePathIgnorePatterns

      테스트 환경에서 무시할 경로들을 불러온다. 즉, 테스틀 하지 않는 것들이다.

    • testURL

      jsdom은 html 환경이라고 이해하면 된다. 환경에서 문제가 생기지 않도록 localhost의 주소를 명시하여 해결한다.

    • transform

      정규 표현식을 통해서 vue,js 확장자를 가지는 파일을 발견하면 테스트 환경에서 동작할 수 있는 새로운 코드로 변환해준다.
      vue 확장자는 vue-jest 패키지를 통해 변환, js 확장자는 babel-jest 패키지를 통해 변환한다.

  • example.test.js

    해당 파일에 test() 코드를 작성해준다. 그러면 에러가 발생한다.
    해당 함수는 전역이라 오류가 발생하면 안되는데 eslint로 인해 에러가 발생한다.

    • .eslintrc.js 수정

      env: {
        browser: true,
        node: true,
        jest: true
      }
      

      eslint를 통해서 jest라는 테스트 환경에서 기본적인 문법들이 lint 에러가 발생하지 않도록 옵션을 추가해준 것이다.

      해당 수정으로 인해 test 전역 함수의 에러가 발생하지 않는다.

테스트 개요

Unit Test


단위(Unit) 테스트란 데이터(상태), 함수(메소드), 컴포넌트 등의 정의된 프로그램 최소 단위들이 독립적으로 정상 동작하는지 확인하는 방법이다.

작성한 로직이 정상적으로 동작하는지 코드 위주로 테스트를 진행한다. 비교적 가볍고 빠르고 단순하게 테스트를 진행하는 것을 선호하여 코드를 작성한다.

사용하는 프레임워크 및 라이브러리: Jest, Vue Test Utils

E2E Test

E2E(End to End) 테스트란 애플리케이션의 처음부터 끝까지의 실제 사용자의 관점에서 사용 흐름을 테스트하는 방법이다.

실제 브라우저 화면에서 만든 애플리케이션(사이트)를 직접 사용하면서 테스트를 진행한다. 화면에서 값을 입력해보거나 직접 버튼을 클릭하면서 정상 작동하는지 확인한다.

사용하는 도구: Cypress

SPA 개요

  • Traditional Web Application

    Traditional Web Application

    패스트 캠퍼스 강의 중 사진 발췌

    클라이언트에서 최초 페이지를 요청하면 서버가 요청한 페이지에 해당하는 html을 클라이언트에게 보내주는 방식이다.

    클라이언트가 about이라는 새로운 페이지를 요청하면 서버는 이에 해당하는 html 파일을 클라이언트에게 보내준다.

  • SPA (Single Page Application)

    SPA

    패스트 캠퍼스 강의 중 사진 발췌

    클라이언트가 최초의 페이지를 요청하면 서버는 해당하는 html 파일을 보내주는 것까지는 위와 동일하다.

    클라이언트가 about 페이지에 접속하게 되면 SPA는 별도의 페이지를 요청하는 것이 아닌 about 페이지에서 기존(최초)의 페이지와 다른 부분을 서버에 요청한다. 이것을 AJAX 요청이라고 한다.
    서버는 클라이언트에게 여러가지 데이터를 내어줄 수 있겠고, 클라이언트의 컴퓨터에서는 처음에 떴던 최초 페이지에서 about 페이지로 달라졌을 때 새롭게 랜더링을 해야 하는 데이터들만 다시 화면에 그려준다.
    따라서 페이지 로드 없이 콘텐츠만 새로고침 된다.

    SPA는 전통적인 web 애플리케이션과 다르게 페이지가 변경되더라도 동일한 컨텐츠는 다시 불러 올 필요가 없다는 장점이 있다.

  • SPA 장점
    • 빠르고 자연스러운 전환으로 훌륭한 사용자 경험 제공
    • 서버에 더 적게 요청해 빠르게 랜더링 가능
    • 컴포넌트 단위 개발로 생산성 향상
    • 쉬운 분업화
  • SPA 단점

    • 최초 페이지 로드 느림
      단 하나의 페이지(index.html)만 사용하기 때문에 가져와야 할 데이터가 많아서, 최초 로드가 느리다.
      ⇒ Lazy loading(사용자에게 당장 보이는 페이지 먼저 로딩), 브라우저 캐싱(필요한 부분을 저장후, 사용자에게 추후에 보여줌)

    • 어려운 검색 엔진 최적화(SEO)
      세부적으로 분리된 페이지에 대한 상세 내용을 검색엔진이 가져가기에는 구조적으로 조금 문제가 있다.
      ⇒ SSR(Server Side Randering이 가능한 방식으로 수정/보완), Serverless Functions을 사용하여 보완

    • 모든 데이터 노출
      모든 파일이 사용자에게 넘어가지기 때문에 중요 내용 또한 넘어가게 된다.
      ⇒ 비즈니스 로직 최소화 (최대한 프론트엔드에서 비즈니스 로직을 작성하지 않도록 주의해야 함)

영화 검색 사이트: Vue Router 정리

Vue Router

컴포넌트

  • RouterView

    페이지가 출력(렌더링)되는 영역 컴포넌트이다.

    달라지는 페이지의 내용들을 어떤 영역에 출력할 것인지를 RouterView 컴포넌트를 사용한 위치에 지정해 줄 수 있다.

  • RouterLink

    페이지 이동을 위한 링크 컴포넌트이다.

    html에서 a태그 대신에 사용했으며, RouterLink가 제공하는 다양한 기능들을 통해서 페이지 이동을 조금 더 쉽고 편리하게 만들수 있다.

객체 데이터

  • $route

    페이지(Route)의 여러 정보를 가지는 객체이다.

    대표적으로 fullPath, params 속성을 이용했다.
    fullPath는 접근된 해당 페이지에 대한 전체 경로, params는 접근된 페이지의 파라미터 정보가 들어있다.

    즉, $route는 접근된 페이지의 여러 정보를 조회하는 용도의 객체이다.

    $route에는 여러가지 속성이 들어가 있다.

  • $router

    페이지(Route)의 조작을 위한 객체이다.

    대표적으로 push 메소드가 있는데, 해당 메소드를 사용해서 RouterLink 컴포넌트 대신에 페이지 이동을 만들었다.
    push를 통해서 페이지를 이동시킨 동작을 만든 것이다.

    즉, 이동이라는 건 페이지를 조작하는 하나의 행동이다.

    $router에는 여러 메소드가 들어있다.

영화 검색 사이트: 검색 정보 초기화 및 페이지 전환 스크롤 위치 복구

페이지 전환 스크롤 위치 복구


Vue Router: scrollBehavior

scrollBehavior을 사용하여 페에지 전환시 스크롤 위치를 원하는 곳으로 옮겨지도록 한다.
기존에는 홈 화면에서 스크롤을 최하단으로 내린 후, 영화를 선택하면 movie 페이지를 처음 보여줄때 홈에서 스크롤을 내렸던 만큼 화면을 내려서 보여줬다.
그러나, scrollBehavior을 통해 스크롤을 최상단으로 바꿔준다.

  • index.js

    scrollBehavior() {
      return { top: 0 }
    }
    

    top: 0 설정을 통해 페이지 전환시 가장 최상단으로 스크롤의 위치가 복구된다.

    resetMovies(state) {
      state.movies = [] // 빈 배열로 초기화
      state.message = _defaultMessage
      state.loading = false
    }
    

검색 정보 초기화


movie.js 파일에 기존에 존재하던 resetMovies 함수에 기능을 추가해준다.
기존에는 홈에서 movie 페이지로 전환 후, 다시 홈 화면으로 뒤로가기를 했을 때 변수 _defaultMessage 문구가 뜨지 않았다.
state.message를 통해서 문구를 나오게 한다. loading 이모션 또한 false로 변경해준다.

resetMovies(state) {
  state.movies = [] // 빈 배열로 초기화
  state.message = _defaultMessage
  state.loading = false
}

Home.vue 파일에서 created라는 컴포넌트가 생성된 직후에 동작하는 라이프사이클에서 commit 메소드를 통해서 store안에 있는 movie 파일의 resetMovies라는 변이 메소드를 실행해준다.

created() {
  this.$store.commit('movie/resetMovies')
}

메소드 실행을 통해서 화면을 리셋할때 배열이 초기화되면서 기본 메세지도 출력된다.