개발자취

TIL | 자동화 테스트 모듈 파헤치기 본문

개발/Dev | 웹개발

TIL | 자동화 테스트 모듈 파헤치기

hnhnhun 2022. 7. 26. 13:46

1. 자동화 테스트 모듈 사용의 목적

  • 프로젝트에 다양한 기능이 추가되고 복잡해지면서 매번 작성하는 코드 시나리오를 하나씩 테스트 하는 것은 비용면에서 굉장히 비효율적이라 할 수 있다.
  • 이러한 상황에서 리팩토링까지 하게 된다면, 아마도 작성해놓은 코드를 하나씩 검증하며 짜야하는 수고가 필요할 것이다.
  • 이러한 이유로 테스트를 자동화하는 도구가 필요하고, 이때 사용하는 테스트 기법으로는 유닛 테스트(unit test), 통합 테스트(integration test)가 있다.

1.1 유닛 테스트(unit test)

유닛 테스트(unit test)는 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차로 모든 함수와 메소드에 대한 테스트 케이스(test case)를 작성하는 과정을 말한다.

https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%9B_%ED%85%8C%EC%8A%A4%ED%8A%B8

 

유닛 테스트 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

  • 본 포스팅에서는 Jest를 다룬다.

1.2 통합 테스트(integration test)

통합 테스트(integration test)는 단위 테스트가 끝난 소프트웨어를 결합해 가며 시험 하는 방법이다. 단위 테스트가 끝난 모듈들을 좀 더 큰 단위의 집합으로 통합 구성한 후, 통합 시험 계획에 따라서 테스트를 수행한다.

https://en.wikipedia.org/wiki/Integration_testing

 

Integration testing - Wikipedia

Phase in software testing in which individual software modules are combined and tested as a group Integration testing (sometimes called integration and testing, abbreviated I&T) is the phase in software testing in which individual software modules are comb

en.wikipedia.org

  • 본 포스팅에서는 supertest와 jest를 연동하여 알아본다.

 

2. 자동화 테스트 모듈

2.1 Jest

  • Jest Web
  • Jest는 Jasmine 위에 구축되고 Meta(페이스북)에서 유지 관리하는 JavaScript 테스트 프레임워크이다.

2.1.1 Jest 설치 방법

  • 터미널에 다음과 같이 스크립트를 작성하여 Jest 및 Jest type 라이브러리 패키지를 설치한다.
  • $ npm install --save-dev jest @types/jest
  • 패키지를 설치한 후 코드 검사를 위한 js 파일을 생성한다.
    • ex) app.js를 확인한다면, app.spec.js 파일을 생성.
  • package.json scpits에 다음을 추가한다.
    • "test": "jest",

2.1.2 Jest 사용법

  • js 파일에는 기본 코드를 다음과 같이 작성한다.
test('our first test', () => {
    expect(1 + 3).toBe(3) // 일부러 틀리게 작성했다 :)
})
* 코드의 의미는 다음과 같다.
    - test할 메서드에 테스트 명을 명시 (ex)'test 1', 'our first test' 등
    - expect(테스트할 내용).toBe(기대되는 결과), 이때 각 메서드에 작성되는 오브젝트 형태는 같아야 한다.
  • $ npm run test
> test
> jest

 FAIL  src/app.spec.js
  × our first test (3 ms)

  ● our first test                                                                                                                                                                                                                        

    expect(received).toBe(expected) // Object.is equality

    Expected: 3
    Received: 4

      4 |
      5 | test('our first test', () => {
    > 6 |     expect(1 + 3).toBe(3)
        |                   ^
      7 | })
      8 |
      9 | /*

      at Object.toBe (src/app.spec.js:6:19)

Test Suites: 1 failed, 1 total                                                                                                                                                                                                            
Tests:       1 failed, 1 total                                                                                                                                                                                                            
Snapshots:   0 total
Time:        0.643 s, estimated 1 s
Ran all test suites.

 

2.2 Supertest

  • Supertest Web
  • HTTP assertion을 위한 라이브러리
  • 본 예제에서는 Jest와 연동해서 supertest를 알아볼 것이다.

2.2.1 Supertest 설치방법

  • 터미널에 다음과 같이 스크립트를 작성하여 supertest 및 supertest type 라이브러리 패키지를 설치한다.
  • $ npm install --save-dev supertest @types/supertest
  • 본 포스팅에서는 supertest와 jest를 함께 사용하는데, 2.1.1에서 이미 환경을 설정하였으므로 다음 과정은 생략한다.

2.2.2 Supertest 사용방법

  • Supertest를 사용하기 위해서는 다음과 같이 작성한다.

*입력

const supertest = require('supertest')          // 패키지를 불러온다.
const app = require('./app')                    // 검사를 위한 파일을 불러온다.

const request = supertest(app)                    // supertest에 검사를 위한 js파일명을 입력한다.

test('our first test', async () => {            // async-await으로 작성이 가능하다.
    const result = await request                // request 오브젝트를 생성한다.
        .get('/users/15')                        // 검사를 위한 파일에서 불러오는 라우터의 값을 받아
        .accept('application/json')                // json 타입으로 받는다.

    expect(result.body).toMatchObject({            // 원하는 형태로 받았는지를 정확하게 확인하기 위해서 toMatchObject함수를 사용
        nickname: expect.any(String),             // test object, nickname이 string 타입인지를 확인해달라는 요청
    })
})

*결과

> test
> jest

 PASS  src/app.spec.js
  √ our first test (33 ms)

Test Suites: 1 passed, 1 total                                                                                                                                                                                                            
Tests:       1 passed, 1 total                                                                                                                                                                                                            
Snapshots:   0 total
Time:        1.044 s, estimated 2 s

 

3. 정리

  • 자동화 테스트 모듈을 통해 앱의 정상성을 터미널로 확인할 수 있다.
  • 코드를 작성할 때마다 일일이 request를 쏴서 확인할 필요가 없고, 브라우저를 접속해 볼 필요도 없다.
  • 따라서 테스트코드를 꼼꼼하게 작성한다면 코드 검증을 위한 절차를 최소화시킨다면 검증 퍼포먼스를 훨씬 더 끌어올릴수 있다.
Comments