본문 바로가기

JavaScript

Node.js 심화 1주차_5_Integration Test

728x90

Node.js 심화 1주차_5_Integration Test


2022.12.29 - [JavaScript] - Node.js 심화 1주차_5

2022.12.29 - [JavaScript] - Node.js 심화 1주차_5_Unit Test

 

 

 

Layered Architecture Pattern 테스트 코드(통합테스트)

 

📌 supertest 이용

계층별 단위 테스트를 구현한 것과 다르게, 

Http Method, API의 URL을 이용하여 테스트를 진행

 

📌 Sequelize DB 설정

 

📄 config/config.json

  "development": {
    "username": "root",
    "password": "비밀번호",
    "database": "layered_architecture_pattern_db",
    "host": "엔드포인트",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": "비밀번호",
    "database": "layered_architecture_pattern_test_db",
    "host": "엔드포인트",
    "dialect": "mysql",
    "logging": false
  },

단순하게 이름만 test_db로 변경

 

📌 test DB 환경 설정(Terminal)

 

오류 발생

node_env=test : the term 'node_env=test' is not recognized as the name of a cmdlet, function, script file, or operable program. check the spelli ng of the name, or if a path was included, verify that the path is correct and try again. at line:1 char:1 + node_env=test npx sequelize db:create + ~~~~~~~~~~~~~ + categoryinfo : objectnotfound: (node_env=test:string) [], commandnotfoundexception + fullyqualifiederrorid : commandnotfoundexception

 

아래 명령어와 script추가로 해결

npm install -g win-node-env

# test 환경에 설정값을 이용해 DB를 생성합니다.
NODE_ENV=test npx sequelize db:create

# test 환경에 설정값을 이용해 Table을 생성합니다.
NODE_ENV=test npx sequelize db:migrate

 

📄 package.json

"scripts": {
    "start": "SET NODE_ENV=production && node server",
	}

test_db생성
migrate명령어로 table 생성

 

📄 app.js

module.exports = app;

📌 GET Method 통합 테스트 (Integration Test)

 

📄 __tests__/integration/posts.integration.spec.js

describe('Layered Architecture Pattern, Posts Domain Integration Test', () => {
  test('GET /api/posts API (getPosts) Integration Test Success Case, Not Found Posts Data', async () => {
    const response = await supertest(app)
      .get(`/api/posts`) // API의 HTTP Method & URL
      
      // API의 Status code가 200번이다
      expect(response.status).toEqual(200);

      // API의 Response 데이터는 { data: [] }
      expect(response.body).toEqual({data:[]});
  });
}

 

📌 Terminal

npm run test:integration

get 통합 테스트

 


📌 POST Method 통합 테스트 (Integration Test)

 

📄 __tests__/integration/posts.integration.spec.js

  test('POST /api/posts API (createPost) Integration Test Success Case', async () => {
    // { nickname, password, titil, content }
    const createPostBodyParams = {
        nickname: "Nickname_Succese",
        password: "Password_Succese",
        title: "Title_Success",
        content: "Content_Success",
    };

    const response = await supertest(app)
    .post('/api/posts')
    .send(createPostBodyParams);

    // Http status Code가 201로 전달되는가
    expect(response.status).toEqual(201);

    // 원하는 데이터로 전달되는가? { postId, nickname, title, content, createdAt, updatedAt }
    expect(response.body).toMatchObject({
        data: {
            postId: 1, 
            nickname: createPostBodyParams.nickname, 
            title: createPostBodyParams.title, 
            content: createPostBodyParams.content, 
            createdAt: expect.anything(), 
            updatedAt: expect.anything()
        }
    });

  });

  test('POST /api/posts API (createPost) Integration Test Error Case, Invalid Params Error', async () => {
    const response = await supertest(app)
    .post('/api/posts')
    .send()

    // Http Status Code가 400번으로 반환
    expect(response.status).toEqual(400);
    
    // { errorMessage: "InvalidParamsError" }의 형태로 데이터가 전달
    expect(response.body).toEqual({
        errorMessage: "InvalidParamsError"
    })
  });

post성공 & 실패(error)

 

 

📌 git repo

godee95/layered-architecture-pattern-tests: layered-architecture-pattern-tests (github.com)

 

GitHub - godee95/layered-architecture-pattern-tests: layered-architecture-pattern-tests

layered-architecture-pattern-tests. Contribute to godee95/layered-architecture-pattern-tests development by creating an account on GitHub.

github.com