2015년 7월 2일 목요일

Node.js] Mocha를 이용하여 테스트 모듈 구성


Node.js 프로젝트에서 테스트를 위해서 Mocha Framework 적용
추가로 supertest, should, expect 등을 설치함.

1. 설치
- Mocha는 Global Module이므로 관리자 권한으로 설치함.
baesunghan:~/git/dentalJobs$sudo npm install -g mocha
Password:
/usr/local/bin/mocha -> /usr/local/lib/node_modules/mocha/bin/mocha
/usr/local/bin/_mocha -> /usr/local/lib/node_modules/mocha/bin/_mocha
mocha@2.2.5 /usr/local/lib/node_modules/mocha
├── escape-string-regexp@1.0.2
├── supports-color@1.2.1
├── growl@1.8.1
├── commander@2.3.0
├── diff@1.4.0
├── debug@2.0.0 (ms@0.6.2)
├── jade@0.26.3 (commander@0.6.1, mkdirp@0.3.0)
├── mkdirp@0.5.0 (minimist@0.0.8)
└── glob@3.2.3 (inherits@2.0.1, graceful-fs@2.0.3, minimatch@0.2.14)
baesunghan:~/git/dentalJobs$

일반계정으로 추가로 다음 모듈도 설치함.
baesunghan:~/git/dentalJobs$npm install supertest
baesunghan:~/git/dentalJobs$npm install should
baesunghan:~/git/dentalJobs$npm install expect


2. test dir 생성
- mocha 실행시 test dir 아래 테스트 모듈을 실행하게 됨
baesunghan:~/git/dentalJobs$mkdir test
baesunghan:~/git/dentalJobs$ll
total 24
drwxr-xr-x  13 baesunghan  staff   442  7  1 16:51 .
drwxr-xr-x  18 baesunghan  staff   612  6 22 09:31 ..
drwxr-xr-x  13 baesunghan  staff   442  7  1 13:55 .git
-rw-r--r--   1 baesunghan  staff    12  6 29 00:07 .gitignore
-rw-r--r--   1 baesunghan  staff  1576  6  9 16:21 app.js
drwxr-xr-x   3 baesunghan  staff   102  6  3 14:03 bin
drwxr-xr-x  13 baesunghan  staff   442  6  3 16:03 node_modules
-rw-r--r--   1 baesunghan  staff   376  6  3 18:47 package.json
drwxr-xr-x   5 baesunghan  staff   170  6  3 14:03 public
drwxr-xr-x   8 baesunghan  staff   272  7  1 16:21 routes
drwxr-xr-x   2 baesunghan  staff    68  7  1 16:51 test
-rw-r--r--   1 baesunghan  staff     0  6  8 10:34 todolist.TODO
drwxr-xr-x  13 baesunghan  staff   442  6 16 18:25 views
baesunghan:~/git/dentalJobs$

3. mocha.opts 생성
- mocha 실행을 위한 기본 환경 설정 파일
--require should
--require supertest
--reporter list
--ui bdd

4. app.js
- 이미 만들어진 app 모듈
- express 로 만들어짐
- route에서 member.js를 require함
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var member = require('./routes/member');
var personal = require('./routes/personal');

var app = express();

5. member.js
- 로그인을 수행하는 로직
- client로 return 메시지는 {code:'0000', message:'SUCCESS!!!!'} or {code:'E002', message:'비밀번호가 틀립니다'} 등으로 구성됨
var CONSTS = require('./consts');
var express = require('express');
var router = express.Router();
var MemberProvider = require('./db/db-member.js').MemberProvider;

var memberProvider = new MemberProvider();

// 로그인 
router.post('/loginc', function(req, res, next) {
    console.log(req.body);
    var vId = req.body.user_id;
    var vPwd = req.body.password;
    var datas = [vId, req.body.mem_type];
    memberProvider.selectSingleQueryByID("selectInfo", datas, function(err, memberInfo) {
        console.log(memberInfo);
        var rtnDatas = CONSTS.getErrData('0000');
        if (memberInfo == null) {
            rtnDatas = CONSTS.getErrData('E001');
        } else if (memberInfo.user_password != vPwd) {
            rtnDatas = CONSTS.getErrData('E002');

        }
        console.log(rtnDatas);
        res.send(rtnDatas);
    });
});



6. consts.js
- 공통 상수/에러코드 정의
function define(name, value) {
    Object.defineProperty(exports, name, {
        value: value,
        enumerable : true,
    });
}

define("OFFICE_TYPE", {"PERSONAL": "P", "TOTAL":"T", "GOVERNMENT":"G"});
define("MEMBER_TYPE", {"PERSONAL": "B", "OFFICE": "C"});

define("ERROR_CODE", {
    "0000": "SUCCESS!!!",
    "E001": "일치하는 ID가 없습니다.",
    "E002": "비밀번호가 틀립니다.",
    "D001": "동일한 #1 #2가 이미 존재합니다.",
    "D002": "DB에 접속할 수 없습니다. 시스템관리자에게 연락하세요.",
    "ER_DUP_ENTRY": "Duplicate entry for key 'PRIMARY'!!!",
    "ER_BAD_NULL_ERROR": "Column 'user_id' cannot be null",
});

function getErrData(key) {
    console.log(key);
    return {code: key, message : exports.ERROR_CODE[key]};
}

exports.getErrData = getErrData;

7. test.js
- Mocha 테스트 모듈
- supertest, expect, should를 모두 테스트 용으로 사용함.
- http 호출은 Async 모드로 수행해함. 그러므로 it('로그인 성공', function(done) 로 해야함.
var should = require('should');
var assert = require("assert")
var request = require("supertest");
var expect = require("chai").expect;
var server = require("../app.js");

describe("회원 가입,로그인 테스트 ->", function() {
    var svr = "http://localhost:4000";

    before(function() {
        server.listen(4000);
    });
    describe("치위생사 ->", function() {
        it ("로그인 성공", function(done) {
            var data = {
                user_id : "e",
                password : "e", 
                mem_type : 'C'
            };

            request(svr)
                .post("/member/loginc")
                .send(data)
                .expect(200)
                .end(function(err, res) {
                    if (err) return done(err);
                    res.body.code.should.be.equal('0000');
                    done();
                });
        });

        it ("로그인 실패", function(done) {
            var data = {
                user_id : "e",
                password : "ea", 
                mem_type : 'C'
            };

            request(svr)
                .post("/member/loginc")
                .send(data)
                .expect(200)
                .end(function(err, res) {
                    if (err) return done(err);
                    Expect('E002').to.equal(res.body.code);
                    done();
                });
        });

    after(function() {
        // server.close();
    });
});

이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

댓글 없음:

댓글 쓰기