Testland
Browse all skills & agents

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-plugin
View source

serverless-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:

  • serverless-offline - emulates API Gateway + Lambda locally; HTTP test surface.
  • serverless invoke local - one-off invocation from CLI.
  • Per-runtime test plugins (serverless-jest-plugin, serverless-mocha-plugin) - install runners aware of serverless project structure.

When to use

  • Lambda projects deployed via Serverless Framework.
  • Tests that exercise API Gateway routing locally.
  • Existing serverless-jest / -mocha tooling.

Authoring

Install

npm install -g serverless
npm install --save-dev serverless-offline serverless-jest-plugin jest

serverless.yml plugin registration

plugins:
  - serverless-offline
  - serverless-jest-plugin

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get

serverless 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 3000

Now 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 tests

The 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-off

CI integration

jobs:
  serverless-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v4
      - run: npm ci
      - run: npx jest

For deployed-Lambda smoke tests:

      - run: serverless deploy --stage staging
      - run: npx jest tests/staging-smoke/

Anti-patterns

Anti-patternWhy it failsFix
Tests use serverless invoke local per testSubprocess startup cost; slowDirect handler invocation
Skip serverless offline for routing testsAPI Gateway routing untestedUse serverless offline for HTTP tests
Hardcoded env vars in test codeDrift from serverless.ymlLoad via dotenv from .env.test
Mocking event object incompletelyHandler reads event.headers → undefinedUse aws-sam-local-testing generate-event
Serverless plugin pinned to old versionBehaviour drift vs prod Lambda runtimeMatch Lambda runtime version
No deployed smoke testsLocal-pass + prod-fail gapAlways include staging smoke
Treating serverless-jest as replacement for direct testAdds plugin complexity for no gainUse plain Jest

Limitations

  • Serverless Framework is one deploy tool of many. SAM, CDK, Terraform also deploy Lambdas; this skill is Serverless-specific.
  • serverless-offline mirrors API Gateway but isn't identical. Subtle differences in CORS, multi-value headers.
  • Cold-start budget per cold-start-budget-reference. Local invocation doesn't simulate Lambda cold start.
  • Plugin ecosystem maintenance varies. serverless-jest is community-maintained; serverless-offline is well-maintained.

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.