Adk Verify Snippets
google/adk-python
Checks that every Python code block in a Markdown file actually compiles and runs, by extracting each block to a temporary file, executing it in an isolated subprocess, and writing a pass/fail…
Generates pytest test suites with happy path, edge cases, error conditions, fixture scaffolding, mocks, async patterns.
$ npx skills add Mathews-Tom/armory --skill test-harness -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Mathews-Tom/armory test-harness --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Mathews-Tom/armory.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/test-harness .claude/skills/test-harness && rm -rf skills-srcUse ~/.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/
Install the "test-harness" agent skill from https://github.com/Mathews-Tom/armory/tree/main/skills/test-harness into .claude/skills/test-harness/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-harness", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Mathews-Tom/armory/tree/main/skills/test-harnessType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Mathews-Tom/armory --skill test-harness -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Mathews-Tom/armory test-harness --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mathews-Tom/armory.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/test-harness .agents/skills/test-harness && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-harness" agent skill from https://github.com/Mathews-Tom/armory/tree/main/skills/test-harness into .agents/skills/test-harness/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-harness", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Mathews-Tom/armory --skill test-harness -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Mathews-Tom/armory test-harness --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mathews-Tom/armory.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/test-harness .cursor/skills/test-harness && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "test-harness" agent skill from https://github.com/Mathews-Tom/armory/tree/main/skills/test-harness into .cursor/skills/test-harness/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-harness", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Mathews-Tom/armory.git --path skills/test-harness--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Mathews-Tom/armory --skill test-harness -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Mathews-Tom/armory test-harness --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mathews-Tom/armory.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/test-harness .gemini/skills/test-harness && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "test-harness" agent skill from https://github.com/Mathews-Tom/armory/tree/main/skills/test-harness into .gemini/skills/test-harness/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-harness", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Mathews-Tom/armory test-harnessInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Mathews-Tom/armory --skill test-harness -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Mathews-Tom/armory.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/test-harness .github/skills/test-harness && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "test-harness" agent skill from https://github.com/Mathews-Tom/armory/tree/main/skills/test-harness into .github/skills/test-harness/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-harness", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Mathews-Tom/armory --skill test-harness -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Mathews-Tom/armory test-harness --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mathews-Tom/armory.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/test-harness .opencode/skills/test-harness && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "test-harness" agent skill from https://github.com/Mathews-Tom/armory/tree/main/skills/test-harness into .opencode/skills/test-harness/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-harness", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
test-harnessGenerates pytest test suites with happy path, edge cases, error conditions, fixture scaffolding, mocks, async patterns.
Test Harness is an agent skill from Mathews-Tom/armory. Generates pytest test suites with happy path, edge cases, error conditions, fixture scaffolding, mocks, async patterns. Triggers on: "generate tests", "write tests for", "test this function", "create test suite", "pytest for", "unit tests for", "mock strategy for".
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including reference files (for example `evals/cases.yaml`, `evals/fixtures/sample_module.py` and `references/async-testing.md`).
It sits in Testing & QA, covering Test generation and Unit testing. It works with pytest. The repository describes itself as: Curated, production-grade skills for AI coding agents. Battle-tested workflows for developers who use AI seriously. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4594fb7. It shows what the files ask for, not the result of running them.
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.
Ships script files (Python), which the agent can run.
Shell commands in SKILL.md call:
gitnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Test Harness loads about 3.5k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 70 tokens; SKILL.md has 1,314 words of instructions outside code blocks.
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.
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.
The full file from Mathews-Tom/armory at commit 4594fb7, republished under its MIT licence (© Mathews-Tom). 1,314 words, ~3,472 tokens.
.claude/skills/test-harness/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Systematic test suite generation that transforms source code into comprehensive, runnable pytest files. Analyzes function signatures, dependency graphs, and complexity hotspots to produce tests covering happy paths, boundary conditions, error states, and async flows — with properly scoped fixtures and focused mocks.
| File | Contents | Load When |
|---|---|---|
references/pytest-patterns.md | Fixture scopes, parametrize, marks, conftest layout, built-in fixtures | Always |
references/mock-strategies.md | Mock decision tree, patch boundaries, assertions, anti-patterns | Target has external dependencies |
references/async-testing.md | pytest-asyncio modes, event loop fixtures, async mocking | Target contains async code |
references/fixture-design.md | Factory fixtures, yield teardown, scope selection, composition | Test requires non-trivial setup |
references/coverage-targets.md | Threshold table, branch vs line, pytest-cov config, exclusion patterns | Coverage assessment requested |
mocker fixture as alternative to unittest.mockBefore writing a single test, build a model of the target code:
git diff --name-only HEAD~5For each function under test, enumerate cases across four categories:
| Category | What to Test | Example |
|---|---|---|
| Happy path | Expected inputs produce expected outputs | add(2, 3) returns 5 |
| Boundary | Edge values at limits of valid input | Empty string, zero, max int, single element |
| Error | Invalid inputs trigger proper exceptions | None where str expected, negative index |
| State | State transitions produce correct side effects | Object moves from pending to active |
For each case, note:
Parametrize cases that share the same test logic but differ only in input/output values.
Identify shared setup — If 3+ tests need the same object, extract a fixture.
Select scope — Use the narrowest scope that avoids redundant setup:
| Scope | Use When | Example |
|---|---|---|
function | Default. Each test gets fresh state | Most unit tests |
class | Tests within a class share expensive setup | DB connection per test class |
module | All tests in a file share setup | Loaded config file |
session | Entire test run shares setup | Docker container startup |
Design teardown — Use yield fixtures when cleanup is needed. Never leave
side effects (temp files, DB rows, monkey-patches) after a test.
Identify conftest candidates — Fixtures used across multiple test files belong
in conftest.py. Fixtures used in one file stay in that file.
Decide what to mock — Mock external dependencies only:
datetime.now, time.sleep)Decide what NOT to mock — Never mock:
Choose mock level — Patch at the import boundary of the module under test,
not at the definition site. @patch('mymodule.requests.get'), not
@patch('requests.get').
Add mock assertions — Every mock should assert it was called with expected arguments and the expected number of times. Mocks without assertions are coverage holes.
Generate the test file following this structure:
# tests/test_{module}.py
import pytest
from unittest.mock import Mock, patch, MagicMock
from {module} import {target_function, TargetClass}
# ============================================================
# Fixtures
# ============================================================
@pytest.fixture
def valid_input():
"""Standard valid input for happy path tests."""
return {concrete values}
@pytest.fixture
def mock_database():
"""Mock database connection."""
with patch("{module}.db_connection") as mock_db:
mock_db.query.return_value = [{expected data}]
yield mock_db
# ============================================================
# {target_function} Tests
# ============================================================
class TestTargetFunction:
"""Tests for {target_function}."""
def test_happy_path(self, valid_input):
"""Returns expected result for valid input."""
result = target_function(valid_input)
assert result == {expected}
@pytest.mark.parametrize(
"input_val, expected",
[
({boundary_1}, {expected_1}),
({boundary_2}, {expected_2}),
({boundary_3}, {expected_3}),
],
ids=["empty", "single", "maximum"],
)
def test_boundary_conditions(self, input_val, expected):
"""Handles boundary inputs correctly."""
assert target_function(input_val) == expected
def test_invalid_input_raises(self):
"""Raises TypeError for invalid input."""
with pytest.raises(TypeError, match="expected str"):
target_function(None)
def test_external_call(self, mock_database):
"""Calls database with correct query."""
target_function("lookup_key")
mock_database.query.assert_called_once_with("SELECT * FROM t WHERE key = %s", ("lookup_key",))| Mode | Scope | Depth | When to Use |
|---|---|---|---|
quick | Single function | Happy path + 1 error case | Rapid iteration, TDD red-green cycle |
standard | File or class | Happy + boundary + error + mocks | Default for most requests |
comprehensive | Module or package | All categories + async + parametrized matrix | Pre-release, critical path code |
"alice@example.com"
not "test_email". 42 not "some_number". Concrete values catch type mismatches that
abstract placeholders mask.@pytest.mark.parametrize. Use ids for readable test names.conftest.py fixtures, class-based tests,
or specific markers, follow those patterns. Do not introduce a conflicting test style.| Problem | Resolution |
|---|---|
| Target function has no type hints | Infer types from usage patterns, default values, and docstrings. Note uncertainty in test docstring. |
| Target has deeply nested dependencies | Mock at the nearest boundary to the function under test. Do not mock transitive dependencies individually. |
| No existing test infrastructure (no conftest, no pytest config) | Generate a minimal conftest.py alongside the test file. Note the addition in output. |
| Target code is untestable (global state, hidden dependencies) | Flag the design issue in the output. Generate tests for what is testable. Suggest refactoring to improve testability. |
| Async code detected but pytest-asyncio not installed | Note the dependency requirement. Generate async test stubs with @pytest.mark.asyncio and instruct user to install. |
| Target module cannot be imported | Report the import error. Do not generate tests for unimportable code. |
Push back if:
| Rationalization | Reality |
|---|---|
| "Manual testing is sufficient" | Manual testing doesn't run in CI, doesn't catch regressions, and doesn't scale with the codebase |
| "This code is too simple to test" | Simple code becomes complex code — tests document expected behavior and catch regressions from future changes |
| "I'll add tests later" | Tests are specifications; without them, code behavior is undefined and later never comes |
| "Mocking everything makes the test fast" | Over-mocked tests pass when the real system fails — mock at boundaries, not deep in the call chain |
| "100% coverage means the code is correct" | Coverage measures execution, not correctness — a test that runs code without meaningful assertions adds no value |
| "The happy path test is enough" | Edge cases and error paths cause most production incidents — happy-path-only testing is false confidence |
test_<unit>_<scenario>_<expected_outcome>pytest / npm test exits 0 with output captured© Mathews-Tom, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 7 other files (references) in skills/test-harness of Mathews-Tom/armory.
Open the folder on GitHubat commit 4594fb7
Test Harness 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Test Harness this skillMathews-Tom/armory | 328 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Adk Verify Snippetsgoogle/adk-python | 22k | — | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| Hermetic Python Unit TestsdimensionalOS/dimos | 4.6k | — | ~1.4k | Automated safety check: Pass | Custom licence | |
| Test Coverage Reviewareed1192/finance-news-aggregator | 149 | — | ~2.6k | Automated safety check: Pass | MIT | |
| Write Test389ds/389-ds-base | 294 | — | ~1.8k | Automated safety check: Pass | Custom licence | |
| MoAI TDD Workflowmodu-ai/moai-adk | 1.2k | — | ~3.1k | Automated safety check: Pass | Apache-2.0 |
google/adk-python
Checks that every Python code block in a Markdown file actually compiles and runs, by extracting each block to a temporary file, executing it in an isolated subprocess, and writing a pass/fail…
dimensionalOS/dimos
Rules for writing, fixing and reviewing pytest unit tests that are hermetic: behavior-focused, deterministic, isolated and cheap to run.
areed1192/finance-news-aggregator
Audit, plan, write, and verify unit tests for Python projects using pytest.
389ds/389-ds-base
Add or extend a pytest integration test for 389 Directory Server under dirsrvtests/.
modu-ai/moai-adk
Drives test-first development through the RED, GREEN, REFACTOR cycle, with a config switch that selects between TDD and a DDD workflow for existing code.
meleantonio/ChernyCode
Testing conventions using pytest. An agent skill from meleantonio/ChernyCode.
Mathews-Tom/armory
Architecture reviews across 7 dimensions (structural, scalability, enterprise readiness, performance, security, ops, data) with scored reports.
Mathews-Tom/armory
Turn concepts into static HTML visuals exported as PNG or SVG files via HTML/CSS/SVG.
Mathews-Tom/armory
A skill your agent uses when analyzing an existing video URL or local recording: "watch this video", "analyze youtube video", "summarize this video", "youtube transcript", "find this moment", "what…
Mathews-Tom/armory
Deep code simplification and refactoring preserving behavior across Python, Go, TypeScript, Rust.
Mathews-Tom/armory
Turn concepts into animated explainer videos using Manim (Python) with MP4/GIF output, audio overlay, multi-scene composition.
Mathews-Tom/armory
Maps the unresolved architecture, policy, and scope decisions that must be answered before planning can start: one durable decision ticket per question on the issue tracker, typed and blocker-linked…
Works with
Categories
Generates pytest test suites with happy path, edge cases, error conditions, fixture scaffolding, mocks, async patterns. Test Harness is an agent skill from Mathews-Tom/armory. Generates pytest test suites with happy path, edge cases, error conditions, fixture scaffolding, mocks, async patterns.
Test Harness fits situations like: : generate tests; write tests for; test this function; create test suite.
Run `npx skills add Mathews-Tom/armory --skill test-harness -a claude-code`. Or copy the skill folder (skills/test-harness in Mathews-Tom/armory) into .claude/skills/test-harness in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Mathews-Tom/armory --skill test-harness -a codex`. Or copy the skill folder (skills/test-harness in Mathews-Tom/armory) into .agents/skills/test-harness in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Mathews-Tom/armory --skill test-harness -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-harness, .gemini/skills/test-harness, .github/skills/test-harness and .opencode/skills/test-harness in your project.
Going by SKILL.md and its folder, Test Harness needs Python for the scripts in its folder and the command-line tools its instructions call (git and npm). Our summary lists: Python 3; Docker.
SKILL.md contains no URLs. Its commands use git and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
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.
Test Harness is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k 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 9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Test Harness: Adk Verify Snippets (google/adk-python, 22k stars), Hermetic Python Unit Tests (dimensionalOS/dimos, 4.6k stars), Test Coverage Review (areed1192/finance-news-aggregator, 149 stars) and Write Test (389ds/389-ds-base, 294 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Mathews-Tom (a GitHub user) maintains it in Mathews-Tom/armory, which has 328 GitHub stars. The repository holds 80 skills in this directory. The repository was last updated on October 6, 2026.
Source: Mathews-Tom/armory on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.