Serverless Framework에서 수행하는 지속적인 통합 권장

개요



서버리스 구성으로 서비스를 구축할 때 유용한 Serverless Framework 하지만 코어에서 유닛 테스트를 돌리는 방법은 제공되지 않습니다. 직접 테스트 프레임 워크를 정의해야합니다. 이번은 그 방법의 소개입니다.

테스트할 Lambda 함수 만들기



다음 명령으로 Lambda 함수를 만듭니다. 이번에는 예로 hello라는 함수를 만들어 보겠습니다.
$ serverless function create hello

그러면 다음과 같은 디렉토리 구성이 완성됩니다.
├── hello
│   ├── event.json
│   ├── handler.js
│   └── s-function.json
handler.js 가 실제로 Lambda로 실행되는 파일이지만 초기 상태에서는 다음과 같은 내용으로 되어 있습니다.
module.exports.handler = function(event, context, cb) {
  return cb(null, {
    message: 'Go Serverless! Your Lambda function executed successfully!'
  });
};

실행시키면 아래와 같이 Go Serverless! Your Lambda function executed successfully! 라는 메세지가 돌아옵니다.


UnitTest의 구성 만들기



이번에는 JavaScript 테스팅 프레임 워크로 유명한 mochachai를 사용합니다.
먼저 Serverless 프로젝트에 설치합니다.
--save-dev 옵션을 지정하여 package.json의 devDependencies에 등록하는 것이 좋습니다.
$ npm install chai --save-dev
$ npm install mocha --save-dev
tests/all.js라는 파일을 프로젝트의 루트 계층 구조로 만듭니다.
├── hello
│   ├── event.json
│   ├── handler.js
│   └── s-function.json
└── tests
    └── all.js

테스트 코드는 다음과 같습니다.
테스트 코드 내에서 Lambda 함수를 실행하여 반환 값을 비교합니다.

tests/all.js
'use strict';
// Unit tests for Serverless
// Generated by Serverless UnitTestBoilerplate
var s
const path       = require('path'),
      chai       = require('chai'),
      should     = chai.should(),
      Serverless = require('serverless')

describe('ServerlessProjectTest', function() {
  beforeEach(function(done) {
    this.timeout(0);

    s = new Serverless();

    s.init().then(function() {
      s.config.projectPath = __dirname + '/../';
      s.setProject(new s.classes.Project({
        stages: {
          dev: { regions: { 'ap-northeast-1': {} }}
        },
        variables: {
          project: 'serverless-project',
          stage: 'dev',
          region: 'ap-northeast-1'
        }
      }));

      s.getProject().setFunction(new s.classes.Function(
        {
          name:"hello",
          runtime:"nodejs4.3"
        },
        __dirname + '/../hello/s-function.json'));

      done();
    });

  });

  describe('#funciton hello()', function() {
    it('should be funciton hello success', function() {
      return s.getProject().getFunction('hello').run('dev', 'ap-northeast-1', {})
      .then(result => {
        result.response.message.should.equal('Go Serverless! Your Lambda function executed successfully!')
      });
    });
  });
});


그리고 package.json에 다음을 추가하면 준비 완료입니다.
├── package.json
├── hello
│   ├── event.json
│   ├── handler.js
│   └── s-function.json
└── tests
    └── all.js

npm에서 전역 설치된 serverless에 path를 통과시키기 위해 export하고 있습니다.

package.json
"scripts": {
    "test": "export NODE_PATH=`npm root -g` && mocha tests/all"
}

테스트를 실행해 봅시다. npm test 결과 다음과 같이 올바르게 테스트되었습니다.


Travis에서 실행



Travis에서 Git에 push한 타이밍에 테스트가 실행되도록 해 봅시다.
프로젝트의 루트 계층 구조에 .travis.yml을 설치합니다.
├── .travis.yml
├── package.json
├── hello
│   ├── event.json
│   ├── handler.js
│   └── s-function.json
└── tests
    └── all.js

파일 내용은 다음과 같습니다.

.travis.yml
language: node_js

node_js:
  - '4'

sudo: false

install:
  - npm install -g serverless
  - npm install

script:
  - npm test

그리고, Travis측의 설정을 실시해, git에 push하면 이하와 같이 테스트를 실행해 주었습니다.
h tps://t 등ゔぃs-해. 오 rg / 호리케 37 / 세르 r ぇ r ぇ s-에서 p ぉ y 면 t cyc ぇ / 부이 lds / 136548908

이번 테스트 코드를 생성해주는 기능을 Serverless 플러그인으로 공개했습니다.



Serverless UnitTest Boilerplate로 게시되었습니다. 자세한 사용법은 README에 기재되어 있습니다. 흥미가 있는 분은 꼭 사용해 보세요!

좋은 웹페이지 즐겨찾기