Skip to main content

test-enforcement

Use after implementing any feature or fix to ensure comprehensive test coverage. Enforces 90% line coverage in openmetadata-service, integration tests for all API endpoints in openmetadata-integration-tests, and Playwright E2E tests for UI changes.

Source facts

Repository
open-metadata/OpenMetadata
Last source activity
October 7, 2026 at 16:14
Detected SKILL.md language
English
Stars
15,586
Forks
2,483

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
test-enforcement
description
Use after implementing any feature or fix to ensure comprehensive test coverage. Enforces 90% line coverage in openmetadata-service, integration tests for all API endpoints in openmetadata-integration-tests, and Playwright E2E tests for UI changes.
user-invocable
true
argument-hint
[PR number, branch name, or file paths]
# Test Enforcement for OpenMetadata Ensure every code change has comprehensive tests — 90% line coverage for service code, integration tests for APIs, and Playwright E2E tests for UI changes. ## When to Use - After implementing any feature or bug fix (before creating a PR) - When reviewing a PR to check test completeness - When the `/tdd` skill was not used during implementation ## Workflow ### Step 1: Identify Changed Files Determine what changed and classify by layer: ```bash # Branch changes git diff main...HEAD --name-only # Or staged changes git diff --cached --name-only # Or PR changes gh pr diff <number> --name-only ``` Classify each changed file: | File path pattern | Layer | Required tests | |---|---|---| | `openmetadata-service/src/main/` | Java backend | Unit tests (90% coverage) + integration tests | | `openmetadata-spec/src/main/resources/json/schema/` | Schema | Regeneration verification + downstream tests | | `openmetadata-integration-tests/` | Integration tests | Self — verify they pass | | `ingestion/src/metadata/` | Python ingestion | pytest unit tests (90% coverage) | | `openmetadata-ui/.../ui/src/` | React frontend | Jest unit tests + Playwright E2E | | `bootstrap/sql/migrations/` | Database | Integration tests verifying migration | ### Step 2: Check Java Service Coverage For any changes under `openmetadata-service/src/main/`: #### 2a. Find existing tests ```bash # For a changed class Foo.java, find its test CHANGED_CLASS="Foo" find openmetadata-service/src/test -name "${CHANGED_CLASS}Test.java" -o -name "${CHANGED_CLASS}Tests.java" # Also check integration tests find openmetadata-integration-tests/src/test -name "*${CHANGED_CLASS}*IT.java" ``` #### 2b. Run coverage for the module ```bash mvn test -pl openmetadata-service -P static-code-analysis -Dtest=<TestClass> # Coverage report: openmetadata-service/target/site/jacoco/index.html ``` #### 2c. Verify 90% line coverage for changed code After running tests, check the JaCoCo report for the specific classes you changed: ```bash # Parse the JaCoCo XML report for specific classes REPORT="openmetadata-service/target/site/jacoco/jacoco.xml" # Look for coverage of your specific packages/classes grep -A5 "name=\"YourClassName\"" "$REPORT" ``` **Target: 90% line coverage on all changed/new classes.** #### 2d. Generate missing tests If coverage is below 90%, create tests following these patterns: **Unit tests** (`openmetadata-service/src/test/`): - Test public methods with meaningful inputs - Test edge cases: null inputs, empty collections, boundary values - Test error paths: invalid input, missing data, permission denied - Use descriptive test names: `testCreateEntityWithValidInput`, `testDeleteEntityNotFound` **Do NOT:** - Mock internal OpenMetadata classes — write integration tests instead - Test obvious getters/setters - Write tests that only verify mock wiring ### Step 3: Check Integration Tests for API Endpoints For any changes to REST resources or entity logic: #### 3a. Map changed code to API endpoints ```bash # Find resource classes that changed git diff main...HEAD --name-only | grep -E "Resource\.java$" # Find the @Path annotations to identify endpoints grep -n "@Path" <resource-file> ``` #### 3b. Check existing integration tests ```bash # Integration test naming convention: <Entity>IT.java find openmetadata-integration-tests/src/test -name "*IT.java" | sort ``` Every REST resource should have a corresponding `*IT.java` that tests: | Operation | What to test | |---|---| | **Create** | Valid creation, duplicate handling, missing required fields | | **Get** | By ID, by name, with fields parameter, not found | | **List** | Pagination, filtering, sorting, limit | | **Update (PUT)** | Full update, partial update, version increment | | **Patch** | JSON patch operations, concurrent modification | | **Delete** | Soft delete, hard delete, cascade behavior | | **Custom endpoints** | Any non-CRUD endpoints specific to the entity | #### 3c. Verify integration tests use the current patterns Tests must follow these patterns: ```java // Extend BaseEntityIT for entity resources class MyEntityIT extends BaseEntityIT<MyEntity, CreateMyEntity> { @Override protected CreateMyEntity createMinimalRequest(TestNamespace testNamespace) { // Return minimal valid create request } @Test void testCustomBehavior(TestNamespace testNamespace) { // Test entity-specific behavior } } ``` **Key patterns:** - Use `TestNamespace` for test isolation (not `TestInfo`) - Use `OpenMetadataClient` SDK for API calls - Use typed exceptions, not raw HTTP status codes - Create entities via API, assert on API responses - Clean up created entities in test teardown #### 3d. Generate missing integration tests If an API endpoint lacks integration test coverage: 1. Read the existing `BaseEntityIT` to understand the contract 2. Read a similar entity's IT class as a reference pattern 3. Create the IT class with all CRUD operations tested 4. Add entity-specific endpoint tests 5. Run and verify. A new or changed IT is selected by the planner, which prints the per-lane command: ```bash make java_affected # then copy MyEntityIT's line, or run them all with make java_affected_run ``` PR CI does not run integration tests; see the `java-affected-tests` skill. ### Step 4: Check Playwright E2E Tests For any changes under `openmetadata-ui/src/main/resources/ui/src/`: #### 4a. Identify UI features affected Map changed components to user-facing features: ```bash # What components changed? git diff main...HEAD --name-only | grep -E '\.(tsx?|component\.tsx)$' # What pages/features do they belong to? # Check the component's imports and route usage ``` #### 4b. Check existing Playwright coverage ```bash # Find specs that test the affected feature find openmetadata-ui/src/main/resources/ui/playwright/e2e -name "*.spec.ts" | xargs grep -l "<feature-keyword>" # List all spec files by category ls openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/ ls openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/ ls openmetadata-ui/src/main/resources/ui/playwright/e2e/Flow/ ``` #### 4c. Determine if new Playwright tests are needed **New Playwright tests ARE needed when:** - A new page or major UI section was added - User-facing workflow was changed (e.g., entity creation flow) - New permissions or role-based behavior was added - A UI bug was fixed (regression test) **New Playwright tests are NOT needed when:** - Only internal refactoring with no visible behavior change - Style-only changes (colors, spacing) - Changes already covered by existing specs (verify by running them) #### 4d. Generate missing Playwright tests Use the `/playwright` skill to generate tests. At minimum, verify: 1. **Read the Playwright Developer Handbook first:** ``` openmetadata-ui/src/main/resources/ui/playwright/PLAYWRIGHT_DEVELOPER_HANDBOOK.md ``` 2. **Required test coverage for new features:** - Happy path — feature works as expected - Permission boundaries — admin vs. data consumer vs. data steward - Data persistence — changes survive page reload - Error states — invalid input, network errors - Navigation — feature accessible from expected entry points 3. **Run and verify:** ```bash cd openmetadata-ui/src/main/resources/ui yarn playwright:run --grep "<test name>" ``` 4. **Run the linter:** ```bash yarn lint:playwright ``` ### Step 5: Check Jest Unit Tests for Frontend For component changes, verify Jest coverage: ```bash cd openmetadata-ui/src/main/resources/ui # Run tests for changed files with coverage yarn test --coverage --collectCoverageFrom='src/path/to/changed/**/*.{ts,tsx}' path/to/test.spec.ts # Check coverage report # Lines, branches, functions should be >= 90% ``` **Every component should have a co-located `.test.ts` or `.test.tsx` file.** ### Step 6: Check Python Ingestion Tests For changes under `ingestion/src/metadata/`: ```bash source env/bin/activate && cd ingestion # Find tests for changed modules CHANGED="my_module" find tests/unit -name "*${CHANGED}*" -o -name "*test_${CHANGED}*" # Run with coverage for specific modules python -m pytest tests/unit/path/to/test.py -v --cov=metadata.ingestion.source.database.my_module --cov-report=term-missing # Verify >= 90% coverage ``` ### Step 7: Generate Coverage Report Produce a summary for the PR: ``` ## Test Coverage Report ### Java Service (openmetadata-service) | Class | Lines | Branches | Status | |-------|-------|----------|--------| | NewFeature.java | 92% | 85% | PASS | | ModifiedClass.java | 88% | 80% | NEEDS WORK | ### Integration Tests (openmetadata-integration-tests) | Endpoint | Create | Get | List | Update | Delete | Custom | |----------|--------|-----|------|--------|--------|--------| | /api/v1/myEntity | PASS | PASS | PASS | PASS | PASS | PASS | ### Playwright E2E | Feature | Happy Path | Permissions | Persistence | Status | |---------|------------|-------------|-------------|--------| | New Feature Page | PASS | PASS | PASS | PASS | ### Python Ingestion | Module | Lines | Status | |--------|-------|--------| | my_connector/metadata.py | 94% | PASS | ### Overall: [PASS / FAIL] ``` ## Coverage Targets | Layer | Metric | Target | How to measure | |-------|--------|--------|----------------| | openmetadata-service | Line coverage | 90% | JaCoCo with `-P static-code-analysis` | | openmetadata-integration-tests | API endpoint coverage | 100% of changed endpoints | Manual check against resource classes | | Playwright | Feature coverage | All new/changed user-facing flows | Spec file existence + test pass | | Jest | Component coverage | 90% lines | `yarn test --coverage` | | Python ingestion | Line coverage | 90% | `pytest --cov` | ## Quick Reference: Test File Locations ``` openmetadata-service/src/test/java/org/openmetadata/ # Java unit tests openmetadata-integration-tests/src/test/java/org/openmetadata/it/ # Integration tests openmetadata-ui/.../ui/src/**/*.test.{ts,tsx} # Jest unit tests openmetadata-ui/.../ui/playwright/e2e/ # Playwright E2E ingestion/tests/unit/ # Python unit tests ingestion/tests/integration/ # Python integration tests ```
View on GitHub