NodeJs

TDD[4] TDD 이해 및 환경 구축

코딩클로스 2021. 3. 31. 15:40

테스트 주도 개발

TDD로 개발하자

mocha, should, superTest

 

TDD 엄밀하게 말해서 100%는 아니다. 테스트코드를 만들고 테스트코드를 통과하는 코드를 만들고 리팩토링하는 싸이클

여기에선 api를 만들고 테스트코드를 만들거나 테스크코드를 만들고 api를 만들거임

 

Mocha

모카(mocha)는 테스트 코드를 돌려주는 테스트 러너

테스트 꾸러미: 테스트 환경으로 모카에서는 describe()으로 구현한다

테스트 케이스: 실제 테스트를 말하며 모카에서는 it()으로 구현한다

 

mocha를 사용해보자 npm i mocha --save-dev 로 설치하자

 

14번줄 스크립트 부분에서 start 부분을 수정했다. 

node index.js  == npm start  똑같은 명령어

 

devDependencies 에 mocha가 추가되는걸 확인할 수 있다. 개발 환경에 필요한 모듈

dependencies에 는 express 등등 분류가 되어있음 실제 서비스가 돌아갈때 필요한 모듈

 

//테스트파일은 파일명에 spec이란 단어를 넣거나 폴더를 만든다

const assert = require('assert') //node 기본 모듈

describe('GET /users', () => {
    it('배열을 반환한다', () => {
        assert.equal(1, 1);
    })
})

성공할 경우

실패할 경우

Should

슈드(should)는 검증(assertion) 라이브러리다

가독성 높은 테스트 코드를 만들 수 있다

 

npm i should --save-dev

//테스트파일은 파일명에 spec이란 단어를 넣거나 폴더를 만든다

const assert = require('assert') //node 기본 모듈
const should = require('should') 


describe('GET /users', () => {
    it('배열을 반환한다', () => {
        //assert.equal(1, 0);
        (1).should.equal(1)
    })
})

 

일반적인 유니테스트 단위테스트가 아님

하나의 함수를 테스트하는게 아님

여러개의 함수로 이루어진하나의 API기능을 테스트 -> 통합적인 테스트가 필요

그래서 !!

SuperTest

npm install supertest --save-dev

 

지금 까지는 우리가 서버를 개발하고 실제로 curl을 날려서 확인하는 작업이였지만,

이제 supertest를 활용해서 자동화하는거임

 

express.js 서버코드와 index.spec.js 파일을 수정하자

 

app을 exports 해주자 앱을 외부에서도 사용할수있게 해야한다. 즉 슈퍼테스트에서 사용할수 있게 해야함

그리고 리슨을 잠시 꺼두자.  왜냐면 슈퍼테스트에서 앱을 자동으로 리슨상태로 만들꺼다.

 

express.js

const express = require('express')
const app = express()
const port = 3000
const users = [{name : 'Alice'}]

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.get('/users', (req, res)=> {
    res.send(users);
})

//app.listen(port, () => {
//  console.log(`Example app listening at http://localhost:${port}`)
//})

module.exports = app

 

index.spec.js

const assert = require('assert') //node 기본 모듈
const should = require('should') 
const request = require('supertest')
const app = require('./express') //express 파일에서 가져옴

describe('GET /users', () => {
    it('배열을 반환한다', () => {
        //assert.equal(1, 0);
        (1).should.equal(1)
    })
})

 

이제 준비는 다됬고 실제로 슈퍼테스트를 사용해서 자체적으로 서버를 뛰우고 요청을 하고 응답을 하는 테스트코드를 작성해보겠다.

//테스트파일은 파일명에 spec이란 단어를 넣거나 폴더를 만든다

const assert = require('assert') //node 기본 모듈
const should = require('should') 
const request = require('supertest')
const app = require('./express') //express 파일에서 가져옴

describe('GET /users', () => {
    it('배열을 반환한다', (done) => {
        request(app)
            .get('/users')
            .end((err, res) => {
                res.body.should.be.instanceof(Array) //응답값이 배열이여야한다
                res.body.forEach(user => {
                    user.should.have.property('name') //응답값안에 name이라는 객체를 가지고있어야한다.
                })
                //console.log(res.body)
            done()       
            })
    })
})