🚀 Lambda 测试革命:使用 HTTP-Interceptor 掌握模拟并大幅降低成本!
TL;DR 📰
了解如何使用 AWS 无服务器服务执行与生产环境相同的集成测试。使用 lambda-http-interceptor,您可以轻松拦截和模拟来自已部署 Lambda 函数的 HTTP 调用。
为什么你应该使用它:
- 你想在与生产环境隔离的环境中测试你的 Lambda 函数🧪
- 你想在运行集成测试时节省成本,避免触发昂贵的第三方 API 💸
- 你想控制第三方 API 的行为来测试极端情况🎯
- 你不想为了让 Lambda 函数可测试而修改它的代码👷
或许你可以同时出于所有这些原因使用它!
在 Lambda 函数中拦截 HTTP 调用 🪝
该库由一个 CDK 构造函数组成,可以在您的堆栈中实例化。
该HttpInterceptor 构造函数需要在栈中实例化,或者在另一个构造函数内部实例化。然后,拦截器需要应用于需要拦截 HTTP 调用的 lambda 函数。
它applyHttpInterceptor用于Aspects将其应用于NodeLambdaFunction找到的每个对象,因此applyHttpInterceptor接受任何构造作为输入。
import { Stack, StackProps } from "aws-cdk-lib";
import { Construct } from "constructs";
import { HttpInterceptor, applyHttpInterceptor } from "lambda-http-interceptor";
import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
import { Runtime } from "aws-cdk-lib/aws-lambda";
export class MyStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const interceptor = new HttpInterceptor(this, "HttpInterceptor");
const myLambdaFunctionThatMakesExternalCalls = new NodejsFunction(
this,
"MakeExternalCalls",
{
runtime: Runtime.NODEJS_18_X,
handler: "index.handler",
entry: './handler.ts',
},
);
applyHttpInterceptor(myLambdaFunctionThatDoesExternalCalls, interceptor);
}
}
部署完成后,堆栈上的所有内容都将设置完毕,以便执行集成测试。
库的第二部分是一组用于执行集成测试的工具。它们都集中在一个HttpLambdaInterceptorClient类中。
import fetch from "node-fetch";
import { expect, describe, it } from "vitest";
process.env.HTTP_INTERCEPTOR_TABLE_NAME = '<table-name-from-construct>'
import { HttpLambdaInterceptorClient } from "lambda-http-interceptor";
import { triggerMyLambdaFunctionThatMakesExternalCalls } from './utils';
describe("my test", () => {
const interceptorClient = new HttpLambdaInterceptorClient(
'<myLambdaFunctionThatMakesExternalCalls-name>',
);
it("tests my lambda function", async () => {
await interceptorClient.createConfigs([
{
url: "https://api-1/*",
response: {
status: 404,
body: JSON.stringify({
errorMessage: "Not found",
}),
},
},
{
url: "https://api-2/path",
response: {
passThrough: true,
},
},
]);
await triggerMyLambdaFunctionThatMakesExternalCalls();
const interceptedCalls = await interceptorClient.pollInterceptedCalls({
numberOfCallsToExpect: 2,
timeout: 5000,
});
expect(resp.interceptedCalls).toBe(2);
});
});
它是如何运作的?📚
lambda-http-interceptor 将配置和调用存储在 DynamoDB 表中 🏪
该方法HttpInterceptor在堆栈中实例化一个 DynamoDB 表。该表用于存储要拦截的 HTTP 调用的配置信息。执行集成测试时,使用该类的createConfigs方法将配置信息填充到表中HttpLambdaInterceptorClient。
pollInterceptedCalls然后,可以使用类的方法获取 lambda 函数发出的调用,并对这些调用进行断言HttpLambdaInterceptorClient。
💡 别忘了给用于执行集成测试的用户授予读取表的权限。通常,我们会为执行这些任务的用户使用 AdministratorAccess 角色。
lambda-http-interceptor 使用内部扩展来拦截 Lambda 函数中的 HTTP 调用📡
拦截器部署在 lambda 函数上的内部扩展会覆盖http用于发出 http 调用的 nodejs 模块。
对于 lambda 发出的每一个调用,它都会从 DynamoDB 中获取存储的 http 调用配置,然后要么直接执行调用,要么返回在开始时配置的响应值。
它会跟踪配置中列出的 HTTP 调用。如果某个调用的响应不需要更改,但仍需要跟踪它以便对其进行断言,则该调用的配置不会更改,响应仅包含passthrough: true.
如果您想深入了解拦截器的功能,可以查看这篇文章,它通过一个简单的例子非常清晰地介绍了扩展。
lambda-http-interceptor 内置了所有功能 💪
设置非常简单,它可以用来对已部署的 Lambda 函数发出的调用进行断言。而且你无需编辑 Lambda 处理程序的代码。
GitHub 上的文档更加详尽,可以帮助你快速入门。
别犹豫,给它点个赞吧⭐️
文章来源:https://dev.to/slsbytheodo/lambda-test-revolution-master-mocking-slash-costs-with-http-interceptor-1i9l