【问题标题】:How to locally test a serverless lambda function?如何在本地测试无服务器 lambda 函数?
【发布时间】:2018-10-11 20:39:17
【问题描述】:

背景

我参与这个项目是为了帮助减轻一些压力。麻烦的是也没有其他人做过这件事,所以我正在开创这一事业。

我所知道的

我可以通过以下方式在本地获取 lambda 函数输出:

serverless invoke local -f getArticlesById -p localfile.json -s dev

它会按预期返回一篇 JSON 文章。

问题

我正在使用 Jasmine 来测试我的 javascript lambda 函数。如何在本地对这些无服务器环境功能进行单元测试?

当前尝试

我的 lambda 函数在 articles/articleHandler.js 中。我有一个 test/articles.js 运行 jasmine 测试利用 lambda-tester 功能。每当我运行这些测试之一时,我都会收到错误

TypeError: Invalid hosts config. Expected a URL, an array of urls, a host config object, or an array of host config objects.
    at new Transport (/Users/Jackson/Sites/serverless-content/node_modules/elasticsearch/src/lib/transport.js:59:13)
    at new EsApiClient (/Users/Jackson/Sites/serverless-content/node_modules/elasticsearch/src/lib/client.js:57:22)
    at Function.Client (/Users/Jackson/Sites/serverless-content/node_modules/elasticsearch/src/lib/client.js:101:10)
    at Object.<anonymous> (/Users/Jackson/Sites/serverless-content-distribution-api-v2/elasticSearch.js:6:42)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)

我发现这是由于在测试中包含了 lambda 函数。当我注释掉该行时,我没有收到错误消息。我猜是因为这不是 serverless 调用,所以 Elasticsearch 对我的环境一无所知。

test/article.js

console.log("testing articles")

const LambdaTester = require("lambda-tester");

const articleHandler = require("../articles/articleHandler.js");

describe("articles getID()", function() {
    it("test success", function() {
        return LambdaTester(articleHandler.getID)
            .event({pathParameters:{id:5633415102001}})
            .expectResult(result => {
                expect(result.body.data.id).to.be(5633415102001)
            });
    });
})
describe("articles getList()", function() {
    it("test success", function() {
        return LambdaTester(articleHandler.getList)
            .event()
            .expectResult(reset => {
                expect(result.body.data.length).to.be(10);
            });
    });
});

** 额外的 **

看起来lambda-tester 应该可以缓解我遇到的问题。今天会发现更多。

【问题讨论】:

    标签: aws-lambda


    【解决方案1】:

    使用lamba-tester,github页面上有例子。

    我写了一个简单的 lambda 测试函数,然后用jasmine + lambda-tester 测试输出

    至于我的代码,我需要重构其他人编写的处理程序才能工作。我的简单测试如下:

    无服务器 yml

      testLambda:
        handler: test/testLambda.getValueOfA
        role: arn:aws:iam::367839381035:role/CodeStarWorker-fx-srch-api-v1-Lambda
        events:
          - http:
              path: test/testLambda/{a}
              method: get
    

    Lambda 函数

    module.exports.getValueOfA = (event, context, callback) => {
        let a = 2;
    
        if(event 
            && event.pathParameters 
            && !isNaN(event.pathParameters.a)
        ) a = event.pathParameters.a;
    
        a = a+a;
    
        let ret = "the value of a is " + a;
    
        callback(null, ret);
    }
    

    测试

    const LambdaTester = require("lambda-tester");
    const TestLambda = require("./testLambda.js");
    
    describe("testLambda()", function() {
        it("test success", function() {
            let ret;
            LambdaTester(TestLambda.getValueOfA)
                .event()
                .expectResult(result => {
                    console.log(result);
                    expect(result).toEqual("the value of a is 4");
                });
        });
    });
    

    我打算为参数设置它,但没有到达那里。当然,这足以让任何人前进。

    【讨论】:

    • 我试过lambda-tester,看起来它确实做得很好。但是,是否可以在 lambda-tester 测试运行时调试 lambda 函数(在 VSCode 中设置断点)?到目前为止我还没有找到办法,从我的角度来看,这将是最后一块拼图。
    【解决方案2】:

    您的另一个选择是直接从您的测试中调用该函数。最后,它只不过是一个函数,所以你可以导入模块并调用它,传递正确的参数。

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2016-02-26
      • 2019-07-28
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2019-06-03
      • 2017-09-28
      • 1970-01-01
      相关资源
      最近更新 更多