Sandbox
@bocato/swift-testing-agent-skill

Swift Testing skill for AI coding tools

This repository packages a Swift Testing skill that AI agents can load when you need test help. It gives guidance on `#expect`, `#require`, test doubles, fixtures, async patterns, and XCTest migration, with deeper reference files for each topic.

80 stars3 forksUpdated 7mo ago
Who it's for

Builders who want their agent to write and refactor Swift tests with modern Swift Testing patterns.

What it delivers

You can get consistent test guidance instead of re-explaining Swift Testing conventions every time.

What it does

Test guidance

Explains when to use `#expect` and `#require`, plus Arrange-Act-Assert and F.I.R.S.T. testing principles.

Test doubles

Covers dummies, fakes, stubs, spies, spying stubs, and mocks, including state vs behavior verification.

Fixtures

Shows how to create fixture helpers with sensible defaults and place them near the model.

Async testing

Includes patterns for async code, callbacks, confirmations, and timeouts.

XCTest migration

Maps XCTest patterns to Swift Testing, including assertion and setup/teardown changes.

Reference files

Provides topic-specific guides in `swift-testing/references/` for navigation and reuse.

How to get it

  1. 1Install this skill with a single command
    npx skills add https://github.com/bocato/swift-testing-agent-skill --skill swift-testing
  2. 2Copy the swift-testing/ folder to your repository's .github/skills/ directory
    # Clone this repo and copy the skill
    git clone https://github.com/bocato/swift-testing-agent-skill.git
    cp -r swift-testing-agent-skill/swift-testing .github/skills/
  3. 3Your project structure should look like
    your-project/
    ├── .github/
    │   └── skills/
    │       └── swift-testing/
    │           ├── SKILL.md
    │           └── references/
    │               └── ...
    └── ...
  4. 4For personal use across all projects, copy to your home directory
    # Create personal skills directory if it doesn't exist
    mkdir -p ~/.copilot/skills
    
    # Copy the skill
    cp -r swift-testing-agent-skill/swift-testing ~/.copilot/skills/
  5. 5Add the marketplace
    /plugin marketplace add bocato/swift-testing-agent-skill
  6. 6Install the Skill
    /plugin install swift-testing@swift-testing-agent-skill

README

Swift Testing Agent Skill

Expert guidance for any AI coding tool that supports the Agent Skills open format — Swift Testing framework, test doubles, fixtures, and testing best practices.

Who this is for

  • Teams adopting Swift Testing framework who need modern testing patterns.
  • Developers writing unit tests, integration tests, or snapshot tests.
  • Anyone wanting reliable test infrastructure (mocks, stubs, spies, fixtures).
  • Teams migrating from XCTest to Swift Testing.

How to Use This Skill

Option A: Using skills.sh (recommended)

Install this skill with a single command:

npx skills add https://github.com/bocato/swift-testing-agent-skill --skill swift-testing

Then use the skill in your AI agent, for example:

Use the swift testing skill and help me write tests for the UserService class

Option B: GitHub Copilot

GitHub Copilot supports Agent Skills in VS Code, VS Code Insiders, and Copilot CLI.

Project Skills (Recommended)

Copy the swift-testing/ folder to your repository's .github/skills/ directory:

# Clone this repo and copy the skill
git clone https://github.com/bocato/swift-testing-agent-skill.git
cp -r swift-testing-agent-skill/swift-testing .github/skills/

Your project structure should look like:

your-project/
├── .github/
│   └── skills/
│       └── swift-testing/
│           ├── SKILL.md
│           └── references/
│               └── ...
└── ...

Personal Skills

For personal use across all projects, copy to your home directory:

# Create personal skills directory if it doesn't exist
mkdir -p ~/.copilot/skills

# Copy the skill
cp -r swift-testing-agent-skill/swift-testing ~/.copilot/skills/

VS Code Configuration

Ensure Agent Skills are enabled in VS Code settings:

{
  "chat.useAgentSkills": true
}

Copilot will automatically discover and load the skill when relevant to your testing tasks.

Option C: Claude Code Plugin

Personal Usage

To install this Skill for your personal use in Claude Code:

  1. Add the marketplace:

    /plugin marketplace add bocato/swift-testing-agent-skill
    
  2. Install the Skill:

    /plugin install swift-testing@swift-testing-agent-skill
    

Project Configuration

To automatically provide this Skill to everyone working in a repository, configure the repository's .claude/settings.json:

{
  "enabledPlugins": {
    "swift-testing@swift-testing-agent-skill": true
  },
  "extraKnownMarketplaces": {
    "swift-testing-agent-skill": {
      "source": {
        "source": "github",
        "repo": "bocato/swift-testing-agent-skill"
      }
    }
  }
}

When team members open the project, Claude Code will prompt them to install the Skill.

Option D: Gemini CLI

Gemini CLI supports custom instructions through GEMINI.md files or the .gemini/ directory.

Project Instructions (Recommended)

Copy the skill content to your project's .gemini/ directory:

# Clone this repo
git clone https://github.com/bocato/swift-testing-agent-skill.git

# Create .gemini directory and copy the skill
mkdir -p .gemini/skills
cp -r swift-testing-agent-skill/swift-testing .gemini/skills/

Your project structure should look like:

your-project/
├── .gemini/
│   └── skills/
│       └── swift-testing/
│           ├── SKILL.md
│           └── references/
│               └── ...
└── ...

Personal Instructions

For personal use across all projects, copy to your home directory:

# Create personal Gemini skills directory
mkdir -p ~/.gemini/skills

# Copy the skill
cp -r swift-testing-agent-skill/swift-testing ~/.gemini/skills/

Gemini CLI will automatically discover skills in these locations when relevant to your testing tasks.

Option E: Manual install

  1. Clone this repository.
  2. Install or symlink the swift-testing/ folder following your tool's official skills installation docs (see links below).
  3. Use your AI tool as usual and ask it to use the "swift-testing" skill for testing tasks.

Where to Save Skills

Follow your tool's official documentation, here are a few popular ones:

How to verify:

Your agent should reference the triage/playbook in swift-testing/SKILL.md and jump into the relevant reference file for your testing question or task.

What This Skill Offers

This skill gives your AI coding tool comprehensive Swift Testing guidance. It can:

Guide Your Testing Decisions

  • Choose the right assertion (#expect vs #require)
  • Structure tests with Arrange-Act-Assert pattern
  • Apply F.I.R.S.T. principles (Fast, Isolated, Repeatable, Self-Validating, Timely)
  • Follow the test pyramid (80% unit, 15% integration, 5% UI)

Write Proper Test Doubles

  • Understand Martin Fowler's test double taxonomy
  • Create Dummies, Fakes, Stubs, Spies, SpyingStubs, and Mocks
  • Choose between state verification and behavior verification
  • Place test doubles close to interfaces with #if DEBUG

Create Maintainable Test Infrastructure

  • Build fixtures with sensible defaults
  • Place fixtures close to models
  • Handle dates deterministically
  • Organize test suites with tags and traits

Test Various Scenarios

  • Write parameterized tests for multiple inputs
  • Test async code with proper patterns
  • Use confirmation for callback/delegate testing
  • Set up snapshot testing for UI regression

Migrate from XCTest

  • Complete XCTest to Swift Testing migration guide
  • Assertion mapping (XCTAssertEqual -> #expect)
  • Setup/teardown patterns (setUp -> init)
  • Async test migration patterns

What Makes This Skill Different

Practical Focus: Based on real-world testing patterns from production codebases, focusing on what developers actually need.

Proper Taxonomy: Uses Martin Fowler's official test double terminology, clarifying the confusion between "mocks" and "spies" in the Swift community.

Non-Opinionated: Focuses on industry-standard best practices like F.I.R.S.T. principles and Arrange-Act-Assert, not architectural preferences.

Swift Testing Ready: Covers the modern Swift Testing framework with @Test, #expect, #require, and @Suite.

Infrastructure Guidance: Includes patterns for test doubles, fixtures, and their proper placement in your codebase.

Skill Structure

swift-testing/
├── SKILL.md                      # Main skill file with decision trees
└── references/
    ├── _index.md                 # Quick navigation for all topics
    ├── test-organization.md      # Suites, tags, traits, parallel execution
    ├── parameterized-tests.md    # Testing multiple inputs efficiently
    ├── async-testing.md          # Async patterns, confirmation, timeouts
    ├── migration-xctest.md       # XCTest to Swift Testing migration
    ├── test-doubles.md           # Dummy, Fake, Stub, Spy, SpyingStub, Mock
    ├── fixtures.md               # Fixture patterns and placement
    ├── integration-testing.md    # Module interaction testing
    └── snapshot-testing.md       # UI regression testing

Core Concepts

Swift Testing Basics

import Testing

@Test("User can be created with valid data")
func createUser() {
    let user = User(name: "Alice", age: 30)
    #expect(user.name == "Alice")
    #expect(user.age == 30)
}

Arrange-Act-Assert

@Test func calculateTotal() {
    // Given
    let cart = ShoppingCart()
    cart.add(Item(price: 10))

    // When
    let total = cart.calculateTotal()

    // Then
    #expect(total == 10)
}

Test Double (SpyingStub)

#if DEBUG
final class UserRepositorySpyingStub: UserRepositoryProtocol {
    // Spy
    private(set) var savedUsers: [User] = []

    // Stub
    var usersToReturn: [User] = []

    func save(_ user: User) async throws {
        savedUsers.append(user)
    }

    func getAll() async throws -> [User] {
        usersToReturn
    }
}
#endif

Fixture

#if DEBUG
extension User {
    static func fixture(
        id: UUID = UUID(),
        name: String = "Test User",
        email: String = "test@example.com"
    ) -> User {
        User(id: id, name: name, email: email)
    }
}
#endif

Contributing

Contributions are welcome! This repository follows the Agent Skills open format, which has specific structural requirements.

We strongly recommend using AI assistance for contributions:

  • Use the skill-creator skill with Claude to ensure proper formatting
  • This helps maintain the Agent Skills format and ensures your contribution works correctly with AI agents

Please read CONTRIBUTING.md for:

  • How to use the skill-creator skill for contributions
  • Agent Skills format requirements
  • Quality standards and best practices
  • Pull request process

This skill is maintained to reflect the latest Swift Testing best practices and will be updated as the framework evolves.

License

This skill is open-source and available under the MIT License. See LICENSE for details.

Files in the repo

Repository payload7 top-level entries
  • .claude-plugin
  • swift-testing
  • .gitignore
  • CHANGELOG.md
  • CONTRIBUTING.md
  • LICENSE
  • README.md

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More skills

obra/
superpowers

An agentic skills framework & software development methodology that works.

285k
1 add

Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.

117k
1 add
Vincentwei1021/
anything2explainer

Topic in, narrated explainer video out. A Claude Code / Codex skill that turns any topic into a black-canvas motion-graphics explainer video with TTS voiceover, subtitles and a chapter progress bar. Chinese or English; every frame drawn in code with Remotion.

666

Open-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)

71k