Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
adobe avatar

Testing Blocks

  • 1.1k installs
  • 158 repo stars
  • Updated August 4, 2026
  • adobe/skills

testing-blocks is an Adobe AEM Edge Delivery Services skill (v2.0.0) that enforces browser-first validation with Playwright or MCP screenshots, npm linting, and value-based Vitest unit tests before opening pull requests

About

testing-blocks is an Adobe skills package at version 2.0.0 for validating AEM Edge Delivery Services code changes before PRs. building-blocks invokes it at Step 5. The four-step workflow runs npm run lint first, then mandatory browser validation at 375px mobile, 768px tablet, and 1200px desktop viewports with screenshots proving render correctness and zero console errors. Browser testing accepts Playwright MCP, temporary Playwright scripts, or manual devtools. Optional Vitest unit tests target logic-heavy utilities while skipping simple DOM decoration. Step 4 runs npm test to catch regressions. Philosophy: maintain tests only when value exceeds cost; browser proof is never optional. Troubleshooting covers aem up --html-folder drafts and /drafts/tmp/ test URLs. Reach for testing-blocks after block, script, or style changes and before any EDS pull request. Acceptance criteria from content-driven-development Step 2 and design mockups drive viewport screenshot comparisons during browser validation. Troubleshooting references aem up --html-folder drafts, drafts/tmp test URLs, and waitForSelector patterns when blocks load asynchronously in local preview environments.

  • Browser tests required before every PR
  • Focus testing effort on real-browser validation of blocks
  • Temporary tests allowed when value does not justify long-term maintenance
  • Validates layout, responsive behavior, DOM, interactions, accessibility, integration and performance
  • Catches issues unit tests cannot detect

Testing Blocks by the numbers

  • 1,084 all-time installs (skills.sh)
  • +67 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #516 of 2,153 Testing & QA skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/adobe/skills --skill testing-blocks

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.1k
repo stars158
Security audit3 / 3 scanners passed
Last updatedAugust 4, 2026
Repositoryadobe/skills

How do you test AEM Edge Delivery blocks before PR?

Enforce disciplined browser-first testing that only creates lasting tests when their long-term value exceeds maintenance cost.

Who is it for?

AEM Edge Delivery Services developers finishing block or style changes who must prove browser behavior before opening a pull request.

Skip if: Pre-implementation planning, backend-only services outside EDS, or changes where browser validation proof is intentionally skipped.

When should I use this skill?

User modified AEM EDS blocks or styles and needs lint, browser screenshots, or Vitest validation before PR.

What you get

Lint-clean code, browser screenshots at three viewports, console-error confirmation, and passing npm test suite.

  • browser screenshots
  • lint pass confirmation
  • test suite results

By the numbers

  • Adobe skill version 2.0.0 with four-step testing workflow
  • Validates three viewport widths: 375px, 768px, and 1200px
  • Browser validation is mandatory; unit tests are optional by value/cost

Files

SKILL.mdMarkdownGitHub ↗

Testing Blocks

This skill guides you through testing code changes in AEM Edge Delivery Services projects. Testing follows a value-versus-cost philosophy: create and maintain tests when the value they bring exceeds the cost of creation and maintenance.

CRITICAL: Browser validation is MANDATORY. You cannot complete this skill without providing proof of functional testing in a real browser environment.

Related Skills

  • content-driven-development: Test content created during CDD serves as the basis for testing
  • building-blocks: Invokes this skill during Step 5 for comprehensive testing
  • block-collection-and-party: May provide reference test patterns from similar blocks

When to Use This Skill

Use this skill:

  • ✅ After implementing or modifying blocks
  • ✅ After changes to core scripts (scripts.js, delayed.js, aem.js)
  • ✅ After style changes (styles.css, lazy-styles.css)
  • ✅ After configuration changes that affect functionality
  • ✅ Before opening any pull request with code changes

This skill is typically invoked by the building-blocks skill during Step 5 (Test Implementation).

Testing Workflow

Track your progress:

  • [ ] Step 1: Run linting and fix issues
  • [ ] Step 2: Perform browser validation (MANDATORY)
  • [ ] Step 3: Determine if unit tests are needed (optional)
  • [ ] Step 4: Run existing tests and verify they pass

Step 1: Run Linting

Run linting first to catch code quality issues:

npm run lint

If linting fails:

npm run lint:fix

Manually fix remaining issues that auto-fix couldn't handle.

Success criteria:

  • ✅ Linting passes with no errors
  • ✅ Code follows project standards

Mark complete when: npm run lint passes with no errors

---

Step 2: Browser Validation (MANDATORY)

CRITICAL: You must test in a real browser and provide proof.

What to Test

Load test content URL(s) in browser and validate:

  • ✅ Block/functionality renders correctly
  • ✅ Responsive behavior (mobile, tablet, desktop viewports)
  • ✅ No console errors
  • ✅ Visual appearance matches requirements/acceptance criteria
  • ✅ Interactive behavior works (if applicable)
  • ✅ All variants render correctly (if applicable)

How to Test

Choose the method that makes most sense given your available tools:

Option 1: Browser/Playwright MCP (Recommended)

If you have MCP browser or Playwright tools available, use them directly:

  • Navigate to test content URL
  • Take accessibility snapshots to inspect rendered content (preferred for interaction)
  • Take screenshots at different viewports for visual validation
  • Consider both full-page screenshots and element-specific screenshots of the block being tested
  • Interact with elements as needed
  • Most efficient for agents with tool access

Option 2: Playwright automation

Write one (or more) temporary test scripts to validate functionality with playwright and capture snapshots/screenshots for inspection and validation.

// test-my-block.js (temporary - don't commit)
import { chromium } from 'playwright';

async function test() {
  const browser = await chromium.launch({ headless: false });
  const page = await browser.newPage();

  // Navigate and wait for block
  await page.goto('http://localhost:3000/path/to/test');
  await page.waitForSelector('.my-block');

  // Inspect accessibility tree (useful for validating structure)
  const accessibilityTree = await page.accessibility.snapshot();
  console.log('Accessibility tree:', JSON.stringify(accessibilityTree, null, 2));
  
  // Optionally save to file for easier analysis
  await require('fs').promises.writeFile(
    'accessibility-tree.json',
    JSON.stringify(accessibilityTree, null, 2)
  );

  // Test viewports and take screenshots
  await page.setViewportSize({ width: 375, height: 667 });
  await page.screenshot({ path: 'mobile.png', fullPage: true });
  await page.locator('.my-block').screenshot({ path: 'mobile-block.png' });

  await page.setViewportSize({ width: 768, height: 1024 });
  await page.screenshot({ path: 'tablet.png', fullPage: true });
  await page.locator('.my-block').screenshot({ path: 'tablet-block.png' });

  await page.setViewportSize({ width: 1200, height: 800 });
  await page.screenshot({ path: 'desktop.png', fullPage: true });
  await page.locator('.my-block').screenshot({ path: 'desktop-block.png' });

  // Check for console errors
  page.on('console', msg => console.log('Browser:', msg.text()));

  await browser.close();
}

test().catch(console.error);

Run: node test-my-block.js then delete the script and analyze the resulting artifacts.

Option 3: Manual browser testing

Use a standard web browser with dev tools: 1. Navigate to test content: http://localhost:3000/path/to/test/content 2. Use browser dev tools responsive mode to test viewports:

  • Mobile: <600px (e.g., 375px)
  • Tablet: 600-900px (e.g., 768px)
  • Desktop: >900px (e.g., 1200px)

3. Check console for errors at each viewport 4. Take screenshots as proof (browser screenshot tool or dev tools)

Validation Against Acceptance Criteria

If acceptance criteria provided (from CDD Step 2):

  • Review each criterion
  • Test specific scenarios mentioned
  • Verify all criteria are met

If design/mockup screenshots provided:

  • Compare implementation to design
  • Verify visual alignment
  • Note any intentional deviations

Proof of Testing

You must provide:

  • ✅ Screenshots of test content in browser (at least one viewport)
  • ✅ Confirmation no console errors
  • ✅ Confirmation acceptance criteria met (if provided)

Success criteria:

  • ✅ All test content loads and renders correctly
  • ✅ Responsive behavior validated across viewports
  • ✅ No console errors
  • ✅ Screenshots captured as proof
  • ✅ Acceptance criteria validated (if provided)

Mark complete when: Browser testing complete with screenshots as proof

---

Step 3: Unit Tests (Optional)

Determine if unit tests are needed for this change.

Write unit tests when:

  • ✅ Logic-heavy functions (calculations, transformations)
  • ✅ Utility functions used across multiple blocks
  • ✅ Data processing or API integrations
  • ✅ Complex business logic

Skip unit tests when:

  • ❌ Simple DOM manipulation
  • ❌ CSS-only changes
  • ❌ Straightforward decoration logic
  • ❌ Changes easily validated in browser

For guidance on what to test: See references/testing-philosophy.md

If unit tests needed:

# Verify test setup (see references/vitest-setup.md if not configured)
npm test

# Write test for utility function
# test/utils/my-utility.test.js
import { describe, it, expect } from 'vitest';
import { myUtility } from '../../scripts/utils/my-utility.js';

describe('myUtility', () => {
  it('should transform input correctly', () => {
    expect(myUtility('input')).toBe('OUTPUT');
  });
});

For detailed unit testing guidance: See references/unit-testing.md

Success criteria:

  • ✅ Unit tests written for logic-heavy code
  • ✅ Tests pass: npm test
  • ✅ OR determined unit tests not needed

Mark complete when: Unit tests written and passing, or determined not needed

---

Step 4: Run Existing Tests

Verify your changes don't break existing functionality:

npm test

If tests fail: 1. Read error message carefully 2. Run single test to isolate: npm test -- path/to/test.js 3. Fix code or update test if expectations changed 4. Re-run full test suite

Success criteria:

  • ✅ All existing tests pass
  • ✅ No regressions introduced

Mark complete when: npm test passes with no failures

Troubleshooting

For detailed troubleshooting guide, see references/troubleshooting.md.

Common issues:

Tests fail

  • Read error message carefully
  • Run single test: npm test -- path/to/test.js
  • Fix code or update test

Linting fails

  • Run npm run lint:fix
  • Manually fix remaining issues

Browser tests fail

  • Verify dev server running: aem up --html-folder drafts
  • Check test content exists in drafts/tmp/
  • Verify URL uses /tmp/ path: http://localhost:3000/drafts/tmp/my-block
  • Add waits: await page.waitForSelector('.block')

Resources

  • Unit Testing: references/unit-testing.md - Complete guide to writing and maintaining unit tests
  • Troubleshooting: references/troubleshooting.md - Solutions to common testing issues
  • Vitest Setup: references/vitest-setup.md - One-time configuration guide
  • Testing Philosophy: references/testing-philosophy.md - Guide on what and how to test

Integration with Building Blocks Skill

The building-blocks skill invokes this skill during Step 5 (Test Implementation).

Inputs received from building-blocks:

  • Block name being tested
  • Test content URL(s) (from CDD Step 4)
  • Any variants that need testing
  • Screenshots of existing implementation/design/mockup to verify against (if provided)
  • Acceptance criteria to verify (from CDD Step 2)

Expected outputs to return to building-blocks:

  • ✅ Confirmation all testing steps complete
  • ✅ Screenshots from browser testing as proof
  • ✅ Confirmation linting passes
  • ✅ Confirmation tests pass
  • ✅ Any issues discovered and resolved

Related skills

How it compares

Use testing-blocks for pre-PR EDS validation; use analyze-and-plan earlier when acceptance criteria are still undefined.

FAQ

Is browser testing optional in testing-blocks?

testing-blocks marks browser validation as mandatory. The skill cannot complete without screenshots proving blocks render at least one viewport, confirmation of no console errors, and validation against provided acceptance criteria.

When does testing-blocks recommend unit tests?

testing-blocks recommends Vitest unit tests for logic-heavy utilities, data processing, and shared helpers. Skip unit tests for simple DOM decoration, CSS-only edits, and changes fully verifiable in the browser.

Is Testing Blocks safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.