AWS Lambda(Node.js)のローカルテストを書く(via 実践AWS Lambda)

実践AWS Lambdaで個人的に一番嬉しかった記述が、ローカルテストの節だったりします。 読みっぱなしだと身につかないので、サンプルコードを触ってみました。 Node.jsをローカルで動かす 書籍のサンプルコードをちょ […]

広告ここから
広告ここまで

目次

    実践AWS Lambdaで個人的に一番嬉しかった記述が、ローカルテストの節だったりします。

    読みっぱなしだと身につかないので、サンプルコードを触ってみました。

    Node.jsをローカルで動かす

    書籍のサンプルコードをちょっとアップデートさせてみたやつ。

    index.js

    exports.handler = (event, context, callback) => {
      callback(null, 'hello from Lambda');
    }
    
    

    index.test.js

    const lambda = require('./index.js');
    const event = "";
    const context = "";
    function callback(error, result) {
      if (typeof error !== 'null') {
        console.error(result);
        process.exit(1);
      }
      console.log(result);
      process.exit(0);
    }
    lambda.handler(event, context, callback);
    
    

    Mocha + power-assertでやる

    どうせならテストライブラリを使ってみましょう。
    npm init -y && npm i -D mocha power-assertでライブラリを準備して、テストコードを以下の様に書けばOKです。

    'use strict';
    const assert = require('assert');
    const lambda = require('./index.js');
    const event = "";
    const context = "";
    
    describe('Lambda test', () => {
      it('Hello Lambda', () => {
          lambda.handler(event, context, (error, result) => {
            assert.equal(result, 'Wrong result');
          });
      });
    });
    

    テストを実行すると、以下の様にFailしてくれます。

    $ ./node_modules/mocha/bin/_mocha index.test.js 
    
    
      Lambda test
        1) Hello Lambda
    
    
      0 passing (8ms)
      1 failing
    
      1) Lambda test
           Hello Lambda:
    
          AssertionError: 'hello from Lambda' == 'Wrong result'
          + expected - actual
    
          -hello from Lambda
          +Wrong result
    
          at lambda.handler (index.test.js:10:16)
          at Object.exports.handler (index.js:2:3)
          at Context.it (index.test.js:9:14)
    
    

    eventの引数を含めたテスト

    テスト対象をちょっと変えてみました。

    exports.handler = (event, context, callback) => {
      if (typeof event.sample === 'undefined') callback(new Error('missing sample'));
      callback(null, event.sample);
    }
    

    event.sampleの値を利用する様にしています。

    これをテストする場合は、こんな感じでいけそうです。

    'use strict';
    const assert = require('assert');
    const lambda = require('./index.js');
    
    describe('Lambda test', () => {
      let event;
      let context;
      beforeEach(() => {
        event = {};
        context = {};
      });
      it('success test', () => {
        event.sample = 'sample'
        lambda.handler(event, context, (error, result) => {
          assert.equal(error, null);
          assert.equal(result, 'sample');
        });
      });
      it('fail test', () => {
        lambda.handler(event, context, (error, result) => {
          assert.equal(result, 'sample');
        });
      });
      it('handle error', () => {
        lambda.handler(event, context, (error, result) => {
          assert.notEqual(error, null);
        });
      });
    });
    

    実際のeventをローカルテストする

    AWS Lambda » 開発者ガイド » イベントソースによって公開されたサンプルイベントからeventに入る値のサンプルを見ることができます。
    これを元にbeforeEachで都度eventの値を定義しておけば良いかなと思います。

    AWS IoTでのケース

    'use strict';
    const assert = require('assert');
    const lambda = require('./index.js');
    
    describe('Lambda test', () => {
      let event;
      let context;
      beforeEach(() => {
        // You can copy and paste from the docs.
        // https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/eventsources.html
        event = {
          "serialNumber": "ABCDEFG12345",
          "clickType": "SINGLE",
          "batteryVoltage": "2000 mV"
        };
        context = {};
      });
    

    最後に

    PythonやJavaでのサンプルも掲載されてますので、興味がある方は是非。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark