add-unit-tests
Guide for adding unit tests to AReaL. Use when user wants to add tests for new functionality or increase test coverage.
Install
mkdir -p .claude/skills/add-unit-tests && curl -L -o skill.zip "https://mcp.directory/api/skills/download/5898" && unzip -o skill.zip -d .claude/skills/add-unit-tests && rm skill.zipInstalls to .claude/skills/add-unit-tests
About this skill
Add Unit Tests
Add unit tests to AReaL following the project's testing conventions.
When to Use
This skill is triggered when:
- User asks "how do I add tests?"
- User wants to increase test coverage
- User needs to write tests for new functionality
- User wants to understand AReaL testing patterns
Step-by-Step Guide
Step 1: Understand Test Types
AReaL has two main test categories:
| Test Type | Purpose | Location Pattern | How It Runs |
|---|---|---|---|
| Unit Tests | Test individual functions/modules | tests/test_<module>_<feature>.py | Directly via pytest |
| Distributed Tests | Test distributed/parallel behavior | tests/torchrun/run_*.py | Via torchrun (called by pytest subprocess) |
Note: All tests are invoked via pytest. Distributed tests use torchrun but are
still called from pytest test files.
Step 2: Create Test File Structure
Create test file with naming convention: test_<module>_<feature>.py
import pytest
import torch
# Import the module to test
from areal.dataset.gsm8k import get_gsm8k_sft_dataset
from tests.utils import get_dataset_path # Optional test utilities
# For mocking tokenizer: from unittest.mock import MagicMock
Step 3: Write Test Functions
Follow Arrange-Act-Assert pattern:
def test_function_under_condition_returns_expected():
"""Test that function returns expected value under condition."""
# Arrange
input_data = 5
expected_output = 10
# Act
result = function_under_test(input_data)
# Assert
assert result == expected_output
Step 4: Add Pytest Markers and CI Strategy
Use appropriate pytest markers:
| Marker | When to Use |
|---|---|
@pytest.mark.slow | Test takes > 10 seconds (excluded from CI by default) |
@pytest.mark.ci | Slow test that must run in CI (use with @pytest.mark.slow) |
@pytest.mark.asyncio | Async test functions |
@pytest.mark.skipif(cond, reason=...) | Conditional skip |
@pytest.mark.parametrize(...) | Parameterized tests |
CI Test Strategy:
@pytest.mark.slow: Excluded from CI by default (CI runspytest -m "not slow")@pytest.mark.slow+@pytest.mark.ci: Slow but must run in CI- No marker: Runs in CI (fast unit tests)
@pytest.mark.asyncio
async def test_async_function():
result = await async_function()
assert result == expected
@pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
def test_gpu_feature():
tensor = torch.tensor([1, 2, 3], device="cuda")
# ... assertions
@pytest.mark.parametrize("batch_size", [1, 4, 16])
def test_with_parameters(batch_size):
# Parameterized test
@pytest.mark.slow
def test_slow_function():
# Excluded from CI by default
@pytest.mark.slow
@pytest.mark.ci
def test_slow_but_required_in_ci():
# Slow but must run in CI
Step 5: Mock Distributed Environment
For unit tests that need distributed mocks:
import torch.distributed as dist
def test_distributed_function(monkeypatch):
monkeypatch.setattr(dist, "get_rank", lambda: 0)
monkeypatch.setattr(dist, "get_world_size", lambda: 2)
result = distributed_function()
assert result == expected
Step 6: Handle GPU Dependencies
Always skip gracefully when GPU unavailable:
CUDA_AVAILABLE = torch.cuda.is_available()
@pytest.mark.skipif(not CUDA_AVAILABLE, reason="CUDA not available")
def test_gpu_function():
tensor = torch.tensor([1, 2, 3], device="cuda")
# ... assertions
Key Requirements (Based on testing.md)
Mocking Distributed
- Use
torch.distributed.fake_pgfor unit tests - Mock
dist.get_rank()anddist.get_world_size()explicitly - Don't mock internals of FSDP/DTensor
GPU Test Constraints
- Always skip gracefully when GPU unavailable
- Clean up GPU memory:
torch.cuda.empty_cache()in fixtures - Use smallest possible model/batch for unit tests
Assertions
- Use
torch.testing.assert_close()for tensor comparison - Specify
rtol/atolexplicitly for numerical tests - Avoid bare
assert tensor.equal()- no useful error message
Reference Implementations
| Test File | Description | Key Patterns |
|---|---|---|
tests/test_utils.py | Utility function tests | Fixtures, parametrized tests |
tests/test_examples.py | Integration tests with dataset loading | Dataset path resolution, success pattern matching |
tests/test_fsdp_engine_nccl.py | Distributed tests | Torchrun integration |
Common Mistakes
- ❌ Missing test file registration: Ensure file follows
test_*.pynaming - ❌ GPU dependency without skip: Always use
@pytest.mark.skipiffor GPU tests - ❌ Incorrect tensor comparisons: Use
torch.testing.assert_close()notassert tensor.equal() - ❌ Memory leaks in GPU tests: Clean up with
torch.cuda.empty_cache() - ❌ Mocking too much: Don't mock FSDP/DTensor internals
- ❌ Unclear test names: Follow
test_<what>_<condition>_<expected>pattern - ❌ No docstrings: Add descriptive docstrings to test functions
Integration with Other Skills
This skill complements other AReaL development skills:
- After
/add-dataset: Add tests for new dataset loaders - After
/add-workflow: Add tests for new workflows - After
/add-reward: Add tests for new reward functions - With
planneragent: Reference this skill when planning test implementation
Running Tests
# First check GPU availability (many tests require GPU)
python -c "import torch; print('GPU available:', torch.cuda.is_available())"
# Run specific test file
uv run pytest tests/test_<name>.py
# Skip slow tests (CI default)
uv run pytest -m "not slow"
# Run with verbose output
uv run pytest -v
# Run distributed tests (requires torchrun and multi-GPU)
# Note: Usually invoked via pytest test files
torchrun --nproc_per_node=2 tests/torchrun/run_<test>.py
<!--
================================================================================
MAINTAINER GUIDE
================================================================================
Location: .claude/skills/add-unit-tests/SKILL.md
Invocation: /add-unit-tests
## Purpose
Step-by-step guide for adding unit tests to AReaL.
## How to Update
### When Testing Conventions Change
1. Update "Key Requirements" section based on `testing.md`
2. Update test examples to match new patterns
3. Update reference implementations
### When Test Types Need Update
1. Update "Understand Test Types" table (currently two main types)
2. Add new examples if needed
3. Update common mistakes
### Integration with Other Skills
Ensure references to other skills (`/add-dataset`, `/add-workflow`, `/add-reward`) remain accurate.
================================================================================
-->More by inclusionAI
View all skills by inclusionAI →You might also like
flutter-development
aj-geddes
Build beautiful cross-platform mobile apps with Flutter and Dart. Covers widgets, state management with Provider/BLoC, navigation, API integration, and material design.
drawio-diagrams-enhanced
jgtolentino
Create professional draw.io (diagrams.net) diagrams in XML format (.drawio files) with integrated PMP/PMBOK methodologies, extensive visual asset libraries, and industry-standard professional templates. Use this skill when users ask to create flowcharts, swimlane diagrams, cross-functional flowcharts, org charts, network diagrams, UML diagrams, BPMN, project management diagrams (WBS, Gantt, PERT, RACI), risk matrices, stakeholder maps, or any other visual diagram in draw.io format. This skill includes access to custom shape libraries for icons, clipart, and professional symbols.
ui-ux-pro-max
nextlevelbuilder
"UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 8 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: glassmorphism, claymorphism, minimalism, brutalism, neumorphism, bento grid, dark mode, responsive, skeuomorphism, flat design. Topics: color palette, accessibility, animation, layout, typography, font pairing, spacing, hover, shadow, gradient."
godot
bfollington
This skill should be used when working on Godot Engine projects. It provides specialized knowledge of Godot's file formats (.gd, .tscn, .tres), architecture patterns (component-based, signal-driven, resource-based), common pitfalls, validation tools, code templates, and CLI workflows. The `godot` command is available for running the game, validating scripts, importing resources, and exporting builds. Use this skill for tasks involving Godot game development, debugging scene/resource files, implementing game systems, or creating new Godot components.
nano-banana-pro
garg-aayush
Generate and edit images using Google's Nano Banana Pro (Gemini 3 Pro Image) API. Use when the user asks to generate, create, edit, modify, change, alter, or update images. Also use when user references an existing image file and asks to modify it in any way (e.g., "modify this image", "change the background", "replace X with Y"). Supports both text-to-image generation and image-to-image editing with configurable resolution (1K default, 2K, or 4K for high resolution). DO NOT read the image file first - use this skill directly with the --input-image parameter.
fastapi-templates
wshobson
Create production-ready FastAPI projects with async patterns, dependency injection, and comprehensive error handling. Use when building new FastAPI applications or setting up backend API projects.
Related MCP Servers
Browse all serversEmpower your Unity projects with Unity-MCP: AI-driven control, seamless integration, and advanced workflows within the U
Boost your AI code assistant with Context7: inject real-time API documentation from OpenAPI specification sources into y
Uno Platform — Documentation and prompts for building cross-platform .NET apps with a single codebase. Get guides, sampl
Create modern React UI components instantly with Magic AI Agent. Integrates with top IDEs for fast, stunning design and
pg-aiguide — Version-aware PostgreSQL docs and best practices tailored for AI coding assistants. Improve queries, migrat
Create and edit PowerPoint presentations in Python with Office PowerPoint. Use python pptx or pptx python tools to add s
Stay ahead of the MCP ecosystem
Get weekly updates on new skills and servers.