Skill v1.0.1
currentAutomated scan100/10012 files
version: "1.0.1" name: ln-743-test-infrastructure description: "Sets up test infrastructure with Vitest, xUnit, and pytest. Use when adding testing frameworks and sample tests to a project." license: MIT
Paths: File paths (references/,../ln-*) are relative to this skill directory.
ln-743-test-infrastructure
Type: L3 Worker Category: 7XX Project Bootstrap
Sets up testing frameworks, coverage tools, and sample tests for projects.
Purpose & Scope
Does:
- Detects project stack to choose appropriate test framework
- Creates test configuration files
- Sets up coverage reporting with thresholds
- Creates sample tests demonstrating patterns
- Verifies test suite runs successfully
Does NOT:
- Configure linters (ln-741 does this)
- Set up pre-commit hooks (ln-742 does this)
- Write actual application tests (developers do this)
Supported Stacks
| Technology | Test Framework | Coverage Tool | Config File | |
|---|---|---|---|---|
| TypeScript/React | Vitest | v8/Istanbul | vitest.config.ts | |
| .NET | xUnit | Coverlet | *.Tests.csproj | |
| Python | pytest | pytest-cov | pytest.ini or pyproject.toml |
Phase 1: Check Existing Tests
Before creating test infrastructure, check what exists.
Files to Check:
| Stack | Test Indicators | |
|---|---|---|
| TypeScript | vitest.config.*, jest.config.*, *.test.ts, *.spec.ts | |
| .NET | *.Tests.csproj, *.IntegrationTests.csproj | |
| Python | pytest.ini, conftest.py, tests/, test_*.py |
Decision Logic:
- If complete test setup exists: SKIP (inform user)
- If partial setup: ASK to extend or replace
- If no tests: CREATE from templates
Phase 2: Create Test Configuration
TypeScript/React (Vitest)
Create vitest.config.ts:
- Use v8 coverage provider (faster than Istanbul)
- Configure jsdom environment for React
- Set coverage thresholds (80% minimum)
- Create setup file for testing-library
Dependencies:
npm install -D vitest @vitest/coverage-v8 @testing-library/react @testing-library/jest-dom jsdom
.NET (xUnit)
Create test project:
dotnet new xunit -n {Project}.Testsdotnet sln add tests/{Project}.Tests
Dependencies (in .csproj):
- Microsoft.NET.Test.Sdk
- xunit
- xunit.runner.visualstudio
- Moq
- FluentAssertions
- coverlet.collector
Python (pytest)
Add to pyproject.toml or create pytest.ini:
- Configure test discovery paths
- Set coverage thresholds (80% minimum)
- Configure coverage reporting
Dependencies:
pip install pytest pytest-cov pytest-asyncio# OR with uv:uv add --dev pytest pytest-cov pytest-asyncio
Phase 3: Create Test Directory Structure
TypeScript
src/├── components/│ ├── Button.tsx│ └── Button.test.tsx # Co-located tests├── test/│ └── setup.ts # Test setup file
.NET
tests/├── {Project}.Tests/│ ├── Controllers/│ │ └── SampleControllerTests.cs│ ├── Services/│ └── {Project}.Tests.csproj└── {Project}.IntegrationTests/ # Optional
Python
tests/├── conftest.py # Shared fixtures (from conftest_template.py)├── unit/│ └── test_sample.py└── integration/ # Optional
For FastAPI/async projects, generate conftest.py from conftest_template.py with shared async HTTP client fixture. Adapt the app import path to match the project.
Phase 4: Create Sample Tests
Create one sample test per stack demonstrating:
- AAA pattern (Arrange-Act-Assert)
- Test naming conventions
- Basic assertions
- Framework-specific patterns
TypeScript Sample Test
Shows:
- render() from testing-library
- screen queries
- Jest-dom matchers
.NET Sample Test
Shows:
- [Fact] attribute
- Moq for mocking
- FluentAssertions syntax
Python Sample Test
Shows:
- pytest fixtures
- assert statements
- parametrized tests (optional)
Phase 5: Verify Test Run
After setup, verify tests work.
TypeScript:
npm testnpm run test:coverage
Expected: Sample test passes, coverage report generated
.NET:
dotnet testdotnet test --collect:"XPlat Code Coverage"
Expected: Sample test passes, coverage collected
Python:
pytestpytest --cov=src --cov-report=term-missing
Expected: Sample test passes, coverage report shown
On Failure: Check test configuration, dependencies, verify sample test syntax.
Coverage Requirements
| Metric | Minimum | Target | |
|---|---|---|---|
| Lines | 70% | 80% | |
| Branches | 70% | 80% | |
| Functions | 70% | 80% | |
| Statements | 70% | 80% |
Configure CI to fail if coverage drops below thresholds.
Critical Rules
RULE 1: Coverage thresholds MUST be configured. No exceptions.
RULE 2: Sample tests MUST pass. Don't create broken examples.
RULE 3: Use AAA pattern (Arrange-Act-Assert) in all sample tests.
RULE 4: Co-locate unit tests with source (TypeScript) or use tests/ directory (.NET, Python).
Monitor (2.1.98+): When test verification after scaffold expected >30s, use Monitor. Fallback: Bash(run_in_background=true).
Definition of Done
- [ ] Test framework installed and configured
- [ ] Coverage tool configured with 80% threshold
- [ ] Test directory structure created
- [ ] Sample test created and passing
- [ ]
npm test/dotnet test/pytestruns successfully - [ ] Coverage report generates
- [ ] User informed of:
- How to run tests
- Where to add new tests
- Coverage requirements
Reference Files
| File | Purpose | |
|---|---|---|
| vitest_template.ts | Vitest config template | |
| vitest_setup_template.ts | Test setup file | |
| react_test_template.tsx | React component test | |
| xunit_csproj_template.xml | .NET test project | |
| xunit_test_template.cs | xUnit test example | |
| pytest_config_template.toml | pytest config | |
| pytest_test_template.py | pytest test example | |
| conftest_template.py | Shared async fixtures (FastAPI) | |
| testing_guide.md | Testing best practices |
Error Handling
| Error | Cause | Resolution | |
|---|---|---|---|
| Vitest not found | Not installed | npm install -D vitest | |
| jsdom errors | Missing dependency | npm install -D jsdom | |
| xUnit discovery fails | SDK version mismatch | Update Microsoft.NET.Test.Sdk | |
| pytest not found | Not in PATH | pip install pytest | |
| Coverage 0% | Wrong source path | Check coverage.include config |
Version: 3.0.0 Last Updated: 2026-03-18