WP-KyotoHome (日本語)Home (English)AboutPrivacy policyLicensesGitHub
AWS

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

実践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でのサンプルも掲載されてますので、興味がある方は是非。

GitHubHomeEnglish