serverless-framework-test-plugin
Wraps the Serverless Framework (serverless.com) test ecosystem: serverless-offline (local HTTP emulator), serverless-jest-plugin / serverless-mocha-plugin (per-runtime test runners), and the `serverless invoke local` CLI for one-off invocations. Use when testing Lambda functions deployed via the Serverless Framework.
Install with skills.sh (any agent)
npx skills add testland/qa --skill serverless-framework-test-pluginserverless-framework-test-plugin
Overview
The Serverless Framework (serverless.com/framework/docs (opens in new window)) is one of the older deploy-frameworks for Lambda. Its test-friendly ecosystem includes:
When to use
Authoring
Install
npm install -g serverless
npm install --save-dev serverless-offline serverless-jest-plugin jestserverless.yml plugin registration
plugins:
- serverless-offline
- serverless-jest-plugin
functions:
hello:
handler: handler.hello
events:
- http:
path: hello
method: getserverless invoke local (single invocation)
serverless invoke local --function hello --data '{"name":"world"}'Output: handler's return value (JSON), plus emulated Lambda log lines.
serverless-offline (local HTTP)
serverless offline --httpPort 3000Now curl http://localhost:3000/hello exercises the full Serverless → API Gateway → Lambda route.
serverless-jest-plugin
Per npmjs.com/package/serverless-jest-plugin (opens in new window):
serverless create test --function hello # Generates test scaffold
serverless invoke test # Runs testsThe scaffold uses Jest under the hood; tests follow standard Jest patterns:
import { hello } from '../handler';
test('returns greeting', async () => {
const event = { queryStringParameters: { name: 'world' } };
const response = await hello(event);
expect(response.statusCode).toBe(200);
expect(JSON.parse(response.body).message).toContain('Hello world');
});Direct handler test (lightweight)
// handler.ts
export const hello = async (event: any) => ({
statusCode: 200,
body: JSON.stringify({ message: `Hello ${event.queryStringParameters?.name ?? 'World'}` }),
});
// handler.test.ts
import { hello } from './handler';
test('hello-world', async () => {
const result = await hello({ queryStringParameters: {} });
expect(result.statusCode).toBe(200);
});This skips the Serverless plugin entirely - often the cleanest path.
Environment variables
serverless-offline reads serverless.yml env definitions:
provider:
environment:
DATABASE_URL: ${env:DATABASE_URL}Tests should mirror this via process.env.DATABASE_URL in jest setup.
Running
npx jest # Direct handler tests
serverless offline # Local HTTP emulator
serverless invoke local --function hello # CLI one-offCI integration
jobs:
serverless-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
- run: npm ci
- run: npx jestFor deployed-Lambda smoke tests:
- run: serverless deploy --stage staging
- run: npx jest tests/staging-smoke/Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
Tests use serverless invoke local per test | Subprocess startup cost; slow | Direct handler invocation |
Skip serverless offline for routing tests | API Gateway routing untested | Use serverless offline for HTTP tests |
| Hardcoded env vars in test code | Drift from serverless.yml | Load via dotenv from .env.test |
Mocking event object incompletely | Handler reads event.headers → undefined | Use aws-sam-local-testing generate-event |
| Serverless plugin pinned to old version | Behaviour drift vs prod Lambda runtime | Match Lambda runtime version |
| No deployed smoke tests | Local-pass + prod-fail gap | Always include staging smoke |
| Treating serverless-jest as replacement for direct test | Adds plugin complexity for no gain | Use plain Jest |
Limitations
References
Related skills
aws-sam-local-testing
Wraps AWS SAM (Serverless Application Model) Local CLI for testing Lambda functions locally: `sam local invoke` (single invocation with event payload), `sam local start-api` (local API Gateway emulator), `sam local start-lambda` (local Lambda invoke endpoint for AWS SDK clients), and event-payload generation (`sam local generate-event`). Use when testing Lambda + API Gateway + integrated AWS services locally.
azure-functions-tests
Runs Azure Functions locally using Azure Functions Core Tools v4 (`func start`), Azurite storage emulation, and framework-native unit tests for handler code (.NET isolated worker model, Node.js v4, Python v2). Covers HTTP, queue, and timer trigger testing, admin-endpoint invocation for non-HTTP triggers, and binding verification via local.settings.json. Use when testing Azure Functions before deployment, reproducing trigger behaviour without live Azure services, or gating function handler logic in CI.
cloudflare-workers-miniflare
Wraps Miniflare 3 (the official Cloudflare Workers simulator) and Wrangler dev for testing Workers locally. Covers Miniflare's getMiniflare() programmatic API (workerd-backed simulation matching prod), the wrangler dev local-mode (live-reload during dev), KV / Durable Objects / R2 / D1 bindings emulation, and Vitest + @cloudflare/vitest-pool-workers for in-process tests. Use when testing Cloudflare Workers code locally.
cold-start-budget-reference
Pure-reference catalog of cold-start budgets across serverless runtimes. Covers AWS Lambda's three-phase cold start (Init: download+unzip+runtime-bootstrap; Init code: imports + module load; Invoke: handler execution), Cloudflare Workers' isolate model (sub-millisecond cold starts via V8 isolates per developers.cloudflare.com), Vercel Edge Runtime, Lambda SnapStart for JVM (snapshot-restore for Java), and provisioned-concurrency trade-offs. Includes per-runtime typical cold-start ranges and the testable behaviours each model creates. Use when designing latency budgets, choosing a runtime, or auditing cold-start variance in production.
lambda-test-tools-net
Wraps Amazon.Lambda.TestTool (the canonical .NET Lambda local-testing toolkit from github.com/aws/aws-lambda-dotnet) for invoking Lambda handlers from xUnit / NUnit tests with simulated AWS Lambda contexts (ILambdaContext, ILambdaSerializer). Covers handler-direct invocation, mock context fixtures, the dotnet-lambda CLI, and integration with the .NET LambdaSerializer for JSON. Use when testing AWS Lambda functions written in C#/.NET.
lambda-timeout-budget-reference
Pure-reference catalog of AWS Lambda timeout + billing semantics. Covers Lambda's hard 15-minute (900s) wall-clock limit, the timeout-vs-deadline relationship (Lambda Context.getRemainingTimeInMillis), per-invocation billing (rounded to 1ms; per-invocation + duration × memory), the memory-vs-CPU relationship (CPU scales linearly with memory), the integration-timeout cascade (API Gateway 29s → Lambda 15min; SQS visibility-timeout vs Lambda timeout), and per-runtime nuances. Use when designing a Lambda's timeout config, debugging timeout-vs-billing surprises, or sizing memory for compute-bound workloads.
netlify-functions-tests
Wraps Netlify Functions testing patterns: Netlify Dev (`netlify dev`) for local routing emulation, the @netlify/functions handler API testing pattern, Netlify Edge Functions (Deno runtime) vs Background Functions (Lambda under the hood) distinction, and scheduled-function (cron) test patterns. Use when testing Netlify Functions or Edge Functions.
serverless-integration-test-builder
Workflow-driven skill that builds the integration-test suite for a serverless application from its IaC definition (SAM template / serverless.yml / Wrangler config / Vercel functions / Netlify functions). Walks through: identifying the function inventory + event sources, picking the right local-emulator per function (sam local / Miniflare / netlify dev / vercel dev / serverless-offline), generating test events per event source, asserting on cold-start + timeout budgets, and emitting the test directory + CI config. Use when introducing integration tests to a serverless project.
vercel-edge-runtime-testing
Wraps Vercel Edge Runtime testing patterns: the @edge-runtime/jest-environment + edge-runtime CLI for executing Web-Standard APIs (Request / Response / fetch) in jest tests, the `vercel dev` local emulator for full route testing, and the Edge vs Node Function divergence (no fs, no Buffer; Request / Response only). Covers the 30s Edge function timeout per vercel.com/docs. Use when testing Vercel Edge Functions or middleware.