Use when testing SUI Move contracts, setting up test suites, running gas benchmarks, or implementing property-based tests. Triggers on test creation, test strategy planning, or quality assurance tasks.
From sui-dev-agentsnpx claudepluginhub first-mover-tw/sui-dev-agents --plugin sui-dev-agentsThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/reference.mdscripts/analyze_lcov.pyscripts/analyze_source.pyscripts/parse_bytecode.pyscripts/parse_source.pyscripts/run-tests.shSearches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Complete testing solution for SUI Move contracts and frontend applications.
This skill provides comprehensive testing across all layers:
Key changes affecting testing (March 2026):
sui move test --filter "regex_pattern" for precise test selection.sui::poseidon::poseidon_bn254.TxContext can be in any argument position. Update integration tests if they assume last-position TxContext.#[error] Annotation: Use #[error] on error constants for human-readable abort messages. Update #[expected_failure] tests to reference constant names, not hardcoded values.events field removed from simulateResult. Access events via effects.events() in dry-run tests.# Run all tests
sui move test
# Run with coverage
sui move test --coverage
# Generate coverage report
sui move coverage summary
# Run specific test (now uses regex!)
sui move test --filter "test_create_listing"
# Run all tests matching pattern
sui move test --filter "test_.*listing"
#[test]
fun test_create_listing() {
let seller = @0xA;
let mut scenario = test_scenario::begin(seller);
// Create and verify listing
let listing = create_listing(nft, 1000, ctx);
assert!(price(&listing) == 1000, 0);
test_scenario::end(scenario);
}
Test cross-module interactions (marketplace + royalty).
test('complete buy flow', async ({ page }) => {
await page.goto('http://localhost:5173');
await page.click('button:has-text("Connect Wallet")');
// ... complete user journey
});
#[test]
fun property_price_distribution() {
// Test invariant: total = seller + royalty + fee
let iterations = 100;
// ... verify invariant holds
}
sui move test --gas-profile
Target: >90% code coverage for core modules
sui move test --coverage
sui move coverage summary
This skill includes Python scripts in scripts/ for detailed coverage analysis:
# Location (relative to plugin install path)
SCRIPTS=<plugin_path>/skills/sui-tester/scripts
# Step 1: Run tests with coverage
cd /path/to/move/package
sui move test --coverage --trace
# Step 2: Source-level analysis (primary tool)
# Uses PTY to capture colored output, identifies exact uncovered segments
python3 $SCRIPTS/analyze_source.py -m <module_name>
python3 $SCRIPTS/analyze_source.py -m <module_name> -o coverage.md # Markdown report
python3 $SCRIPTS/analyze_source.py -m <module_name> --json # JSON output
# Step 3: LCOV statistics (function/line/branch breakdown)
sui move coverage lcov
python3 $SCRIPTS/analyze_lcov.py lcov.info -s sources/ --issues-only
# Step 4: Low-level bytecode analysis (optional)
sui move coverage bytecode --module <name> | python3 $SCRIPTS/parse_bytecode.py
# Step 5: Piped source analysis (alternative to analyze_source.py)
script -q /dev/null sui move coverage source --module <name> | python3 $SCRIPTS/parse_source.py
analyze_source.py to get uncovered segments#[expected_failure] testsA. Uncalled function:
#[test]
fun test_<function_name>() {
let mut ctx = tx_context::dummy();
<function_name>(&mut ctx);
// Assert expected behavior
}
B. Assertion failure path:
#[test]
#[expected_failure(abort_code = <ERROR_CONST>)]
fun test_<function>_fails_when_<condition>() {
let mut ctx = tx_context::dummy();
// Setup state that triggers the assertion failure
<function_call_that_should_fail>();
}
C. Branch coverage (if/else):
#[test]
fun test_<function>_when_true() { /* condition = true path */ }
#[test]
fun test_<function>_when_false() { /* condition = false path */ }
❌ Not using test_scenario properly
test_scenario::next_tx between transactions, clean up with test_scenario::end❌ Testing with unrealistic gas budgets
--gas-limit flag❌ Ignoring test cleanup
#[expected_failure] for abort tests❌ Not testing error cases
assert! and abort paths with #[expected_failure(abort_code = X)]❌ Skipping property-based tests for math
❌ Not benchmarking gas costs
sui move test --gas-profile, track gas per operation❌ E2E tests without proper wallet setup
Test execution targets:
See reference.md for complete test patterns and examples.md for test examples.