프로그래밍 언어/NODE JS

노드 서비스 테스트하기 - 테스트 준비하기

· 코딩마이데이

실제 서비스를 개발 완료 후, 개발자나 QA들은 자신이 만든 서비스가 제대로 동작하는지 테스트합니다. 이때 기능이 많다면 일일이 수작업으로 테스트하기에는 작업량이 너무 많을 수 있습니다. 이런 경우 테스트를 자동화하여 프로그램이 프로그램을 테스트하도록 만들기도 합니다.

또한, 테스트 환경과 실제 서비스 환경을 다르므로 테스트하는 제약이 따를 수도 있고, 테스트 결과와 실제 동작 결과가 다를 수도 있습니다. 이럴 때는 테스트 환경에서 실제 환경을 최대한 흉내 내서 작업합니다.

단, 테스트를 아무리 철저하게 해도 에러를 완전히 막을 수는 없습니다. 보통 에러는 개발자가 예상하지 못한 케이스에서 발생하므로, 예상하지 못한다면 그에 대한 테스트도 작성할 수 없습니다. 하지만 모든 에러를 없앨 수 없다라도 테스트는 작성하는 게 좋습니다. 간단한 에러로 인해 프로그램이 고장나는 것은 막을 수 있기 때문입니다.

 

테스트 준비하기

테스트에 사용할 패키지는 jest입니다. 이 패키지는 페이스북에서 만든 오픈 소스로, 테스팅에 필요한 불들을 대부분 갖추고 있어 편리합니다.

Nodebird 프로젝트를 그래로 사용하고, 여기에 jest 패키지를 설치합니다. 테스팅 툴은 개발 시에만 사용하므로 -D 옵션을 사용합니다.

$ npm i -D jest

 

package.json에 test라는 명령어를 등록해둡니다. 명령어를 실행할 때 jest가 실행됩니다.

{
    "name": "nodebird",
    "version": "0.0.1",
    "description": "익스프레스로 만드는 SNS 서비스",
    "main": "app.js",
    "scripts": {
        "start": "nodemon app",
        "test": "jest"
    },
    "author": "cherry",
    "license": "MIT",
    "dependencies": {
        "bcrypt": "^6.0.0",
        "cookie-parser": "^1.4.7",
        "dotenv": "^17.2.3",
        "express": "^5.1.0",
        "express-session": "^1.18.2",
        "morgan": "^1.10.1",
        "multer": "^2.0.2",
        "mysql2": "^3.15.1",
        "nunjucks": "^3.2.4",
        "passport": "^0.7.0",
        "passport-kakao": "^1.0.1",
        "passport-local": "^1.0.0",
        "sequelize": "^6.37.7",
        "sequelize-cli": "^6.6.3"
    },
    "devDependencies": {
        "jest": "^30.2.0",
        "nodemon": "^3.1.10"
    }
}

 

routes 폴더 안에 middlewares.test.js를 만듭니다. 테스트용 파일은 파일명과 확장자 사이에 test나 spec을 넣으면 됩니다.

npm test를 테스트 코드를 실행할 수 있습니다. 파일명에 test나 spec이 들어간 파일들을 모두 찾아 실행합니다.

$ npm test

> nodebird@0.0.1 test
> jest

 FAIL  routes/middlewares.test.js
  ● Test suite failed to run

    Your test suite must contain at least one test.

      at onResult (node_modules/@jest/core/build/index.js:1057:18)
      at node_modules/@jest/core/build/index.js:1127:165
      at node_modules/emittery/index.js:363:13
          at Array.map (<anonymous>)
      at Emittery.emit (node_modules/emittery/index.js:361:23)

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

 

테스트를 아무것도 작성하지 않았으므로 에러가 발생합니다. 이를 테스트가 실패했다고 표현합니다. 첫 번째 테스트 코드를 작성해봅시다.

test("1 + 1은 2입니다.", () => {
  expect(1 + 1).toEqual(2);
});

 

test 함수의 첫 번째 인수로는 테스트에 대한 설명을 적고, 두 번째 인수인 함수에는 테스트 내용을 적습니다. expect 함수의 인수로 실제 코드를, toEqual 함수의 인수로 예상되는 결괏값을 넣으면 됩니다.

$ npm test

> nodebird@0.0.1 test
> jest

 PASS  routes/middlewares.test.js
  √ 1 + 1은 2입니다. (9 ms)

Test Suites: 1 passed, 1 total                                                                                                    
Tests:       1 passed, 1 total                                                                                                    
Snapshots:   0 total
Time:        2.951 s
Ran all test suites.

 

expect에 넣은 값과 toEqual에 넣은 값이 일치하면 테스트를 통과합니다. 두 값을 다르게 해서도 테스트해보세요. toEqual의 값을 3으로 바꾼 후 테스트를 재실행했습니다.

test("1 + 1은 2입니다.", () => {
  expect(1 + 1).toEqual(3);
});

 

$ npm test

> nodebird@0.0.1 test
> jest

 FAIL  routes/middlewares.test.js
  × 1 + 1은 2입니다. (33 ms)

  ● 1 + 1은 2입니다.
                                                                                                                                  
    expect(received).toEqual(expected) // deep equality

    Expected: 3
    Received: 2

      1 | test("1 + 1은 2입니다.", () => {
    > 2 |   expect(1 + 1).toEqual(3);
        |                 ^
      3 | });
      4 |

      at Object.toEqual (routes/middlewares.test.js:2:17)

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

 

테스트가 실패하면 정확히 어떤 부분에서 실패했는지 시각적으로 보여줍니다. 따라서 코드에 대해 테스트를 작성해두면 어떤 부분에 문제가 있는지 명확하게 파악할 수 있습니다.

 

'프로그래밍 언어 > NODE JS' 카테고리의 다른 글

유닛 테스트(2)  (0) 2025.12.20
유닛 테스트  (0) 2025.12.16
CORS 이해하기  (0) 2025.12.11
사용량 제한 구현하기  (0) 2025.12.04
다른 서비스에서 호출하기  (0) 2025.11.28