Claude Code Plugins

Community-maintained marketplace

Feedback

moai-domain-testing

@jg-chalk-io/Nora-LiveKit
0
0

Enterprise testing framework with pytest 8.4.x, Vitest 4.x, Playwright

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name moai-domain-testing
version 4.0.0
description Enterprise testing framework with pytest 8.4.x, Vitest 4.x, Playwright 1.48.x, Testing Library 15.x, httpx 0.28.x, k6 load testing, and accessibility testing
allowed_tools Read, Bash, WebSearch, WebFetch
updated 2025-11-18
status stable
stability stable

Enterprise Testing Framework & Quality Assurance -

Skill Overview

Stable Versions (November 2025):

  • pytest 8.4.2 (Python comprehensive testing)
  • Vitest 4.x (TypeScript browser mode stable)
  • Playwright 1.48.x (Multi-browser automation)
  • Testing Library 15.x (User-centric component testing)
  • httpx 0.28.x (Async HTTP testing)
  • k6 1.0+ (Modern load testing)
  • axe-core 4.8.x (WCAG 2.1 compliance)

Focus: Production-grade testing strategies with 85%+ coverage targets


Level 1: Quick Reference (50-150 lines)

Essential Testing Patterns

pytest 8.4.x Foundation:

# conftest.py - Essential fixtures
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

@pytest.fixture(scope="session")
def db_engine():
    """Database engine for entire test session."""
    engine = create_engine("sqlite:///:memory:")
    yield engine
    engine.dispose()

@pytest.fixture
def db_session(db_engine):
    """Isolated database session for each test."""
    connection = db_engine.connect()
    transaction = connection.begin()
    session = sessionmaker(bind=connection)()
    
    yield session
    
    session.close()
    transaction.rollback()
    connection.close()

@pytest.fixture
def user_factory():
    """Factory for creating test users."""
    def _create_user(name="Test User", email="test@example.com", **kwargs):
        return {
            "name": name,
            "email": email,
            "is_active": True,
            **kwargs
        }
    return _create_user

# Test usage
def test_user_creation(db_session, user_factory):
    user = user_factory(email="custom@example.com")
    assert user["email"] == "custom@example.com"

Vitest 4.x TypeScript Setup:

// vitest.config.ts - Enterprise configuration
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  test: {
    browser: {
      provider: 'playwright',
      enabled: true,
      instances: [{ browser: 'chromium' }, { browser: 'firefox' }],
    },
    coverage: {
      provider: 'v8',
      reporter: ['text', 'json', 'html'],
      lines: 85,
      functions: 85,
      branches: 80,
    },
    typecheck: { enabled: true },
    setupFiles: ['./vitest.setup.ts'],
  },
});

Playwright 1.48.x E2E Foundation:

// playwright.config.ts - Multi-browser setup
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './e2e',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  
  use: {
    baseURL: 'http://localhost:3000',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
  },

  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
  ],
});

Testing Library User-Centric Testing:

// React Testing Library example
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

test('user can submit form with valid data', async () => {
  const user = userEvent.setup();
  render(<LoginForm onSubmit={vi.fn()} />);

  await user.type(
    screen.getByRole('textbox', { name: /email/i }),
    'user@example.com'
  );

  const passwordInput = screen.getByLabelText(/password/i);
  await user.type(passwordInput, 'password123');

  await user.click(
    screen.getByRole('button', { name: /submit/i })
  );

  expect(screen.getByText(/success/i)).toBeInTheDocument();
});

Core Testing Principles:

  • ✅ Test isolation (no shared state)
  • ✅ User-centric testing (Testing Library)
  • ✅ 85%+ coverage targets
  • ✅ Multi-browser E2E testing
  • ✅ Accessibility compliance testing

Level 2: Practical Implementation (200-300 lines)

Advanced Testing Architecture

pytest Advanced Patterns:

# Async testing with httpx
@pytest.mark.asyncio
async def test_api_endpoint():
    """Test async HTTP client with httpx."""
    async with httpx.AsyncClient() as client:
        response = await client.get(
            "http://localhost:8000/api/users",
            timeout=10.0
        )
        assert response.status_code == 200
        data = response.json()
        assert len(data) > 0

# Parametrized testing
@pytest.mark.parametrize("input_value,expected", [
    ("valid", True),
    ("invalid", False),
    ("edge_case", None),
])
def test_validator_with_params(input_value, expected, db_session):
    result = validate_input(input_value, db_session)
    assert result == expected

Playwright Page Object Pattern:

// e2e/fixtures.ts - Reusable fixtures
import { test as baseTest } from '@playwright/test';

class LoginPage {
  constructor(private page: Page) {}
  
  async login(email: string, password: string) {
    await this.page.fill('[data-testid="email"]', email);
    await this.page.fill('[data-testid="password"]', password);
    await this.page.click('[data-testid="login-btn"]');
    await this.page.waitForURL('/dashboard');
  }
}

export const test = baseTest.extend({
  loginPage: async ({ page }, use) => {
    await use(new LoginPage(page));
  },
});

// Usage
test('user login flow', async ({ page, loginPage }) => {
  await page.goto('/login');
  await loginPage.login('user@example.com', 'password123');
  await expect(page).toHaveURL('/dashboard');
});

Test Data Factories:

# tests/factories.py - Polyfactory for Pydantic models
from polyfactory.factories.pydantic_factory import ModelFactory
from pydantic import BaseModel

class User(BaseModel):
    id: int
    email: str
    name: str
    is_active: bool

class UserFactory(ModelFactory[User]):
    __model__ = User

# Generate test data
user = UserFactory.create()  # Single instance
users = UserFactory.batch(5)  # Batch of 5

Accessibility Testing:

// tests/accessibility.spec.ts - WCAG 2.1 compliance
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

test('accessibility audit: homepage', async ({ page }) => {
  await page.goto('http://localhost:3000');

  const accessibilityScanResults = await new AxeBuilder({ page })
    .withTags(['wcag2aa', 'wcag2aaa'])
    .analyze();

  expect(accessibilityScanResults.violations).toEqual([]);
});

Mock & Stub Patterns:

# tests/test_external_services.py - pytest-mock integration
def test_email_sending(mocker):
    """Mock external email service."""
    mock_send = mocker.patch('app.services.EmailService.send')
    mock_send.return_value = True

    send_notification(user_id=1, message="Hello")

    mock_send.assert_called_once_with(
        to="user@example.com",
        subject="Notification",
        body="Hello"
    )

k6 Load Testing:

// tests/load.js - Modern load testing with k6
import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 20 },
    { duration: '30s', target: 0 },
  ],
  thresholds: {
    http_req_duration: ['p(95)<500', 'p(99)<1000'],
    http_req_failed: ['rate<0.1'],
  },
};

export default function () {
  const response = http.get('http://localhost:3000/api/users');
  check(response, {
    'GET status 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });

  sleep(1);
}

Level 3: Advanced Integration (50-150 lines)

Enterprise Testing Strategy

Testing Pyramid Implementation:

# Test execution strategy
# Local development
pytest --watch

# Pre-commit: Unit + fast integration
pytest tests/unit tests/integration -k "not slow"

# CI pipeline:
# 1. Unit tests (pytest + Vitest)
pytest tests/unit --cov --cov-fail-under=85
npm run test:unit

# 2. Integration tests
pytest tests/integration

# 3. E2E tests
npx playwright test

# 4. Performance baselines
k6 run tests/load.js

# 5. Accessibility audit
npm run test:a11y

Coverage.py Configuration:

# .coveragerc - Enterprise coverage configuration
[run]
source = src
omit =
    */tests/*
    */test_*.py
    */__pycache__/*
    */.venv/*

[report]
exclude_lines =
    pragma: no cover
    def __repr__
    if __name__ == .__main__.:
    raise AssertionError
    raise NotImplementedError
    if TYPE_CHECKING:
    @abstractmethod

precision = 2
show_missing = True
skip_covered = False

[html]
directory = htmlcov

Enterprise Test Strategy:

Testing Pyramid Approach:

        /\
       /  \  E2E Tests (10-15%)
      /    \  - Playwright
     /______\  - Cypress
     
    /        \
   /  API     \  Integration Tests (25-35%)
  /  Tests    \  - httpx
 /____________\  - Supertest

/              \
/   Unit Tests   \  Unit Tests (50-60%)
\   (pytest,     /  - pytest
 \   Vitest)    /   - Vitest
  \____________/

Best Practices Checklist:

  • Test Isolation: Each test runs independently
  • Fixture Scoping: Use appropriate scopes (function/module/session)
  • Async Handling: Proper async/await in tests and fixtures
  • Mock Strategy: Mock external services, not internal logic
  • Coverage Targets: Maintain ≥85% code coverage
  • CI/CD Integration: Tests run in automated pipelines
  • Performance: Tests complete in <30s (unit), <5m (integration), <10m (E2E)
  • Accessibility: WCAG 2.1 compliance automated in E2E tests

Version: 4.0.0 Enterprise
Last Updated: 2025-11-18
Status: Production Ready
Coverage Target: 85%+
Testing Pyramid: Unit (50-60%), Integration (25-35%), E2E (10-15%)