A skill your agent uses when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests.

MITAuto-check passedTesting & QA

Install Frappe Testing Unit

skills CLI
$ npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-testing-unit -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install Impertio-Studio/Frappe_Claude_Skill_Package frappe-testing-unit --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/Impertio-Studio/Frappe_Claude_Skill_Package.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/source/testing/frappe-testing-unit .claude/skills/frappe-testing-unit && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
frappe-testing-unit
GitHub stars
188
Token cost
~3k tokens
SKILL.md length
665 words
Files
6 (incl. references)
Skills in repo
61
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests.

  • Works in 6 steps: NEVER forget super().setUpClass() —… → NEVER call frappe.db.commit() in tests —… → ALWAYS reset user in tearDown if you… → …
  • Writing unit tests
  • SKILL.md covers Quick Reference, Decision Tree: Which Test Base…, Test Base Classes and Test File Structure, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Frappe Testing Unit is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests. Prevents flaky tests from missing fixtures, incorrect test isolation, and wrong test base classes. Covers frappe.tests.utils, IntegrationTestCase, UnitTestCase, test fixtures, bench run-tests flags, test naming conventions. Keywords: unit test, integration test, IntegrationTestCase, fixtures, bench run-tests, frappe.tests, test.py, how to write test, test fixtures, run tests, test fails, bench run-tests…

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/anti-patterns.md`, `references/api-reference.md` and `references/examples.md`). Compatibility notes: Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

It sits in Testing & QA, covering Integration testing, Unit testing and Test data and fixtures. The repository describes itself as: 60 deterministic Claude AI skills for Frappe Framework & ERPNext v14-v16 development and operations. The licence is MIT.

When your agent uses it

  • Writing unit tests
  • Integration tests
  • Creating test fixtures
  • Running tests with bench run-tests

Example prompts

  • “/frappe-testing-unit”

Requirements

  • Python 3
  • Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. NEVER forget super().setUpClass() — omitting this breaks fixture loading and user setup
  2. NEVER call frappe.db.commit() in tests — this persists data across tests and breaks isolation
  3. ALWAYS reset user in tearDown if you called frappe.set_user() directly (v14 pattern)
  4. ALWAYS prefix test data with _Test — makes cleanup and identification easy
  5. NEVER rely on test execution order — each test MUST be independent
  6. ALWAYS use frappe.flags to guard fixture creation — prevents duplicate inserts

What it can do on your machine

Read from SKILL.md and the folder at commit 36cfa80. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python and json).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.

    From compatibility in the SKILL.md frontmatter.

Context cost

Frappe Testing Unit loads about 3k tokens when it runs, and up to ~9.9k if it reads all its reference files. Until then it costs about 137 tokens; SKILL.md has 665 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~137
When it runs · the whole SKILL.md, loaded when a task matches
~3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~9.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from Impertio-Studio/Frappe_Claude_Skill_Package at commit 36cfa80, republished under its MIT licence (© Impertio-Studio). 665 words, ~3,050 tokens.

Download SKILL.mdSave it as .claude/skills/frappe-testing-unit/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
frappe-testing-unit
description
Use when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests. Prevents flaky tests from missing fixtures, incorrect test isolation, and wrong test base classes. Covers frappe.tests.utils, IntegrationTestCase, UnitTestCase, test fixtures, bench run-tests flags, test naming conventions. Keywords: unit test, integration test, IntegrationTestCase, fixtures, bench run-tests, frappe.tests, test_*.py, how to write test, test fixtures, run tests, test fails, bench run-tests example..
compatibility
Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16.
license
MIT
metadata.author
OpenAEC-Foundation
metadata.version
2.0

Unit & Integration Testing

Quick Reference

TaskCommand / Class
Run all testsbench --site test_site run-tests
Run tests for appbench --site test_site run-tests --app myapp
Run tests for doctypebench --site test_site run-tests --doctype "Sales Order"
Run single test methodbench --site test_site run-tests --doctype "Sales Order" --test test_submit
Run tests for modulebench --site test_site run-tests --module "myapp.mymodule.doctype.mydt.test_mydt"
Run with profilerbench --site test_site run-tests --doctype "Task" --profile
Run with failfastbench --site test_site run-tests --failfast
Generate JUnit XMLbench --site test_site run-tests --junit-xml-output /path/report.xml
Skip fixture loadingbench --site test_site run-tests --skip-test-records --skip-before-tests
Base class (v14)from frappe.tests.utils import FrappeTestCase
Unit test class (v15+)from frappe.tests.classes import UnitTestCase
Integration test class (v15+)from frappe.tests.classes import IntegrationTestCase

Decision Tree: Which Test Base Class?

Need to test a function or method in isolation?
├─ YES → Does it require database access?
│   ├─ NO → UnitTestCase (v15+) or FrappeTestCase (v14)
│   └─ YES → IntegrationTestCase (v15+) or FrappeTestCase (v14)
└─ NO → Need to test document lifecycle (create/submit/cancel)?
    ├─ YES → IntegrationTestCase (v15+) or FrappeTestCase (v14)
    └─ NO → Need to test permissions or user context?
        ├─ YES → IntegrationTestCase (v15+) or FrappeTestCase (v14)
        └─ NO → UnitTestCase (v15+) or FrappeTestCase (v14)

Version note: In v14, FrappeTestCase is the ONLY base class. In v15+, it still works (deprecated wrapper) but ALWAYS prefer UnitTestCase or IntegrationTestCase for new code.

Test Base Classes

FrappeTestCase (v14: still works in v15+ as compatibility wrapper)
python
from frappe.tests.utils import FrappeTestCase

class TestMyDoctype(FrappeTestCase):
    def test_something(self):
        doc = frappe.get_doc({"doctype": "My Doctype", "field": "value"})
        doc.insert()
        self.assertEqual(doc.field, "value")

Behavior: Resets frappe.local.flags after each test. Database transactions start before each test and rollback afterward. ALWAYS call super().setUpClass() if you override setUpClass.

UnitTestCase (v15+): No Database Access
python
from frappe.tests.classes import UnitTestCase

class TestMyUtils(UnitTestCase):
    def test_calculation(self):
        result = my_calculation(10, 20)
        self.assertEqual(result, 30)

    def test_html_output(self):
        html = generate_html()
        self.assertEqual(self.normalize_html(html), self.normalize_html(expected))

Behavior: Sets frappe.set_user("Administrator") in setUpClass. Auto-detects doctype from module path. Provides normalize_html(), normalize_sql(), assertDocumentEqual(), assertQueryEqual(), assertSequenceSubset().

IntegrationTestCase (v15+): Full Database Access
python
from frappe.tests.classes import IntegrationTestCase

class TestSalesOrder(IntegrationTestCase):
    def test_submit_order(self):
        so = frappe.get_doc({
            "doctype": "Sales Order",
            "customer": "_Test Customer",
            "items": [{"item_code": "_Test Item", "qty": 1, "rate": 100}]
        }).insert()
        so.submit()
        self.assertEqual(so.docstatus, 1)

Behavior: Extends UnitTestCase. Calls frappe.init() and sets up site connection. Loads test record dependencies via make_test_records(). Provides primary_connection() and secondary_connection() context managers. maxDiff = 10_000.

Test File Structure

ALWAYS place test files in the doctype directory following this naming convention:

myapp/
└── mymodule/
    └── doctype/
        └── my_doctype/
            ├── my_doctype.py          # DocType controller
            ├── my_doctype.json        # DocType definition
            ├── test_my_doctype.py     # Test file (MUST start with test_)
            └── test_records.json      # Optional: test fixtures

Rules:

  • ALWAYS prefix test files with test_ — the test runner ignores files without this prefix
  • ALWAYS use test_{doctype_in_snake_case}.py for doctype tests
  • NEVER place test files outside the doctype directory for doctype-specific tests
  • Non-doctype tests can live in any module, but MUST follow the test_*.py naming

Test Fixtures

Method 1: test_records.json (Static Fixtures)

Create a test_records.json file in the doctype directory:

json
[
    {
        "doctype": "My Doctype",
        "field1": "_Test Value 1",
        "field2": 100
    },
    {
        "doctype": "My Doctype",
        "field1": "_Test Value 2",
        "field2": 200
    }
]

Rules:

  • ALWAYS prefix test data values with _Test to distinguish from production data
  • The test runner auto-loads these before running tests for the doctype
  • Link field dependencies are resolved automatically — the runner builds records for linked DocTypes first
Method 2: _test_records List (In-Module Fixtures)
python
_test_records = [
    {"doctype": "My Doctype", "field1": "_Test Value 1"},
    {"doctype": "My Doctype", "field1": "_Test Value 2"},
]
python
def create_test_data():
    if frappe.flags.test_data_created:
        return
    frappe.set_user("Administrator")
    frappe.get_doc({
        "doctype": "My Doctype",
        "field1": "_Test Value",
    }).insert()
    frappe.flags.test_data_created = True

class TestMyDoctype(IntegrationTestCase):
    def setUp(self):
        create_test_data()

ALWAYS use frappe.flags to prevent duplicate fixture creation across test methods.

Testing Patterns

Testing Document Lifecycle
python
class TestInvoice(IntegrationTestCase):
    def test_full_lifecycle(self):
        # Create
        doc = frappe.get_doc({"doctype": "Sales Invoice", ...}).insert()
        self.assertEqual(doc.docstatus, 0)  # Draft

        # Submit
        doc.submit()
        self.assertEqual(doc.docstatus, 1)  # Submitted

        # Cancel
        doc.cancel()
        self.assertEqual(doc.docstatus, 2)  # Cancelled
Testing Permissions
python
class TestPermissions(IntegrationTestCase):
    def test_user_cannot_read_private(self):
        frappe.set_user("test1@example.com")
        doc = frappe.get_doc("Event", {"subject": "_Test Private Event"})
        self.assertFalse(frappe.has_permission("Event", doc=doc))

    def tearDown(self):
        # ALWAYS reset user in tearDown
        frappe.set_user("Administrator")
Testing with User Context (v15+ Context Manager)
python
class TestAccess(IntegrationTestCase):
    def test_restricted_access(self):
        with self.set_user("test1@example.com"):
            self.assertRaises(
                frappe.PermissionError,
                frappe.get_doc, "Salary Slip", "SAL-001"
            )
        # User automatically restored after context manager exits
Testing Whitelisted Methods
python
class TestAPI(IntegrationTestCase):
    def test_whitelisted_method(self):
        frappe.set_user("test1@example.com")
        result = frappe.call("myapp.api.get_dashboard_data", filters={})
        self.assertIsInstance(result, dict)
        self.assertIn("total", result)
Mocking External Services
python
from unittest.mock import patch, MagicMock

class TestIntegration(IntegrationTestCase):
    @patch("myapp.integrations.stripe.requests.post")
    def test_payment_gateway(self, mock_post):
        mock_post.return_value = MagicMock(
            status_code=200,
            json=lambda: {"status": "success", "id": "ch_123"}
        )
        result = process_payment(amount=1000, currency="USD")
        self.assertEqual(result["status"], "success")
        mock_post.assert_called_once()
Testing with Settings Changes
python
class TestFeature(IntegrationTestCase):
    def test_with_modified_settings(self):
        with self.change_settings("Selling Settings", {"so_required": 1}):
            # Settings temporarily changed
            self.assertRaises(frappe.ValidationError, create_delivery_note)
        # Settings automatically reverted
Testing with Hook Overrides
python
class TestHooks(IntegrationTestCase):
    def test_custom_hook(self):
        with self.patch_hooks({"on_submit": ["myapp.hooks.custom_on_submit"]}):
            doc = create_and_submit_doc()
            # Verify hook was executed
Show full SKILL.md (265 more words)Show less

Context Managers Reference

Context ManagerAvailable OnPurpose
set_user(user)UnitTestCase, IntegrationTestCaseTemporarily switch user context
change_settings(dt, **kw)UnitTestCase, IntegrationTestCaseTemporarily modify settings
patch_hooks(overrides)UnitTestCase, IntegrationTestCaseTemporarily override hooks
freeze_time(time)UnitTestCase, IntegrationTestCaseFreeze time for deterministic tests
debug_on(*exceptions)UnitTestCase, IntegrationTestCaseDrop into debugger on exception
timeout(seconds)DecoratorFail test if it exceeds time limit
enable_safe_exec()IntegrationTestCaseEnable server scripts temporarily
switch_site(site)IntegrationTestCaseSwitch to a different site
assertQueryCount(n)IntegrationTestCaseAssert exact SQL query count
assertRedisCallCounts(**kw)IntegrationTestCaseAssert Redis command counts
assertRowsRead(n)IntegrationTestCaseAssert row-level DB access limits

Database State Management

  • IntegrationTestCase: ALWAYS rolls back database after each test — no cleanup needed
  • UnitTestCase: No database connection — NEVER use frappe.db calls
  • Each test gets a clean state: transactions start in setUp and rollback in tearDown
  • NEVER call frappe.db.commit() in tests — this breaks test isolation
  • Use frappe.flags.in_test to check if code is running under the test runner

Detecting Test Mode

python
if frappe.flags.in_test:
    # Skip external API calls, emails, etc.
    return mock_response()

NEVER use frappe.flags.in_test to skip validation logic — tests MUST exercise the same code paths as production.

Common Pitfalls

  1. NEVER forget super().setUpClass() — omitting this breaks fixture loading and user setup
  2. NEVER call frappe.db.commit() in tests — this persists data across tests and breaks isolation
  3. ALWAYS reset user in tearDown if you called frappe.set_user() directly (v14 pattern)
  4. ALWAYS prefix test data with _Test — makes cleanup and identification easy
  5. NEVER rely on test execution order — each test MUST be independent
  6. ALWAYS use frappe.flags to guard fixture creation — prevents duplicate inserts

See Also

© Impertio-Studio, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (references) in skills/source/testing/frappe-testing-unit of Impertio-Studio/Frappe_Claude_Skill_Package.

  • SKILL.md
  • references/.gitkeep
  • references/anti-patterns.md
  • references/api-reference.md
  • references/examples.md
  • references/fixtures.md

Open the folder on GitHubat commit 36cfa80

Compare with similar skills

Frappe Testing Unit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Frappe Testing Unit compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Frappe Testing Unit this skillImpertio-Studio/Frappe_Claude_Skill_Package188—~3kAutomated safety check: PassMIT
Testingredis/RedisInsight8.9k—~3.3kAutomated safety check: PassCustom licence
Run Testsrunceel/ReactiveProperty944—~3.6kAutomated safety check: PassMIT
Atmos Testscloudposse/atmos1.4k—~1.9kAutomated safety check: PassApache-2.0
Memstack Development Test Writercwinvestments/memstack423—~3.7kAutomated safety check: PassProprietary
Test Suite Curationpetrkindlmann/qa-skills168—~6.3kAutomated safety check: PassMIT

Similar skills

  • Testing

    redis/RedisInsight

    Official

    Unit/integration testing standards for RedisInsight using Jest and Testing Library: test structure, the renderComponent helper, faker for test data, mocking patterns, and waitFor instead of fixed…

    8.9k GitHub stars~3.3k tokensUpdated 4 days ago
    Testing & QAAuto-check passed
  • Run Tests

    runceel/ReactiveProperty

    Runs .NET tests with dotnet test. An agent skill from runceel/ReactiveProperty.

    944 GitHub stars~3.6k tokensUpdated 1 mo ago
    Testing & QAAuto-check passed
  • Atmos Tests

    cloudposse/atmos

    Author Atmos smoke tests, post-deployment stack checks, and integration tests using type: test, HTTP assertions, shell or script/interpreter checks, require gates, parallel dependencies, matrix…

    1.4k GitHub stars~1.9k tokensUpdated today
    Testing & QAAuto-check passed
  • Memstack Development Test Writer

    cwinvestments/memstack

    A skill your agent uses when the user says 'write tests', 'add tests', 'test coverage', 'unit tests', 'integration tests', 'component tests', 'mocking', 'edge cases', or needs to generate tests with…

    423 GitHub stars~3.7k tokensUpdated 12 days ago
    Testing & QAAuto-check passed
  • Test Suite Curation

    petrkindlmann/qa-skills

    Audit a whole regression suite and prune/restructure it with evidence: per-test coverage fingerprinting, AST near-duplicate clustering, CI-history mining for never-failing and flaky tests, prune…

    168 GitHub stars~6.3k tokensUpdated 4 mo ago
    Testing & QAAuto-check passed
  • Testing Safe Protocol

    archibate/dotfiles-opencode

    Safe testing practices to prevent real-world side-effects. An agent skill from archibate/dotfiles-opencode.

    108 GitHub stars~3.2k tokensUpdated 5 mo ago
    Testing & QAAuto-check: notes

More from Impertio-Studio/Frappe_Claude_Skill_Package

All 61 skills in this repo
  • Frappe Ops Website Deploy

    Impertio-Studio/Frappe_Claude_Skill_Package

    Deploy HTML/CSS websites to ERPNext/Frappe (v15/v16) as Web Pages via the REST API.

    188 GitHub stars~2.5k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Architect

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when designing multi-app Frappe architectures, deciding whether to split functionality into separate apps, or implementing cross-app communication patterns.

    188 GitHub stars~2.8k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Debugger

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when debugging Frappe errors, using bench console for live inspection, analyzing tracebacks, or reading Frappe log files.

    188 GitHub stars~2.9k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Interpreter

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when receiving vague or unclear ERPNext/Frappe development requests that need interpretation.

    188 GitHub stars~3.2k tokensUpdated 22 days ago
    Auto-check passed
  • Frappe Agent Migrator

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when migrating a Frappe app between major versions, detecting breaking API changes, or resolving post-migration errors.

    188 GitHub stars~2.8k tokensUpdated 22 days ago
    Auto-check: notes
  • Frappe Agent Validator

    Impertio-Studio/Frappe_Claude_Skill_Package

    A skill your agent uses when reviewing or validating Frappe/ERPNext code against best practices and common pitfalls.

    188 GitHub stars~2.8k tokensUpdated 22 days ago
    Auto-check passed

Categories

Questions about Frappe Testing Unit

What does Frappe Testing Unit do?

A skill your agent uses when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests. Frappe Testing Unit is an agent skill from Impertio-Studio/Frappe_Claude_Skill_Package. Use when writing unit tests, integration tests, creating test fixtures, or running tests with bench run-tests.

When should I use Frappe Testing Unit?

Frappe Testing Unit fits situations like: writing unit tests; integration tests; creating test fixtures; running tests with bench run-tests.

How do I install Frappe Testing Unit in Claude Code?

Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-testing-unit -a claude-code`. Or copy the skill folder (skills/source/testing/frappe-testing-unit in Impertio-Studio/Frappe_Claude_Skill_Package) into .claude/skills/frappe-testing-unit in your project. Claude Code loads it when a task matches its description.

How do I install Frappe Testing Unit in Codex?

Run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-testing-unit -a codex`. Or copy the skill folder (skills/source/testing/frappe-testing-unit in Impertio-Studio/Frappe_Claude_Skill_Package) into .agents/skills/frappe-testing-unit in your project. Codex loads it when a task matches its description.

Can I use Frappe Testing Unit in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Impertio-Studio/Frappe_Claude_Skill_Package --skill frappe-testing-unit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/frappe-testing-unit, .gemini/skills/frappe-testing-unit, .github/skills/frappe-testing-unit and .opencode/skills/frappe-testing-unit in your project.

What does Frappe Testing Unit need to run?

SKILL.md names no scripts, command-line tools or credentials: Frappe Testing Unit is instructions for the agent only. Our summary lists: Python 3. Compatibility (from SKILL.md): Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16..

Does Frappe Testing Unit access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Frappe Testing Unit safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Frappe Testing Unit use?

Frappe Testing Unit is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Frappe Testing Unit use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.9k tokens, read only when the agent opens those files.

What are the alternatives to Frappe Testing Unit?

Skills that share tags, products or a category with Frappe Testing Unit: Testing (redis/RedisInsight, 8.9k stars), Run Tests (runceel/ReactiveProperty, 944 stars), Atmos Tests (cloudposse/atmos, 1.4k stars) and Memstack Development Test Writer (cwinvestments/memstack, 423 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Frappe Testing Unit?

Impertio-Studio (a GitHub organization) maintains it in Impertio-Studio/Frappe_Claude_Skill_Package, which has 188 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on September 17, 2026.

Source: Impertio-Studio/Frappe_Claude_Skill_Package on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.