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