Skip to content
Development
Skill

/nw-test-refactoring-catalog

Detailed refactoring mechanics with step-by-step procedures, and test code smell catalog with detection patterns and before/after examples

From plugin
nwave
628151 skills34 agents27 commands

Claude Code

$ npx -y skills add nWave-ai/nWave --skill nw-test-refactoring-catalog --agent claude-code

SKILL.md

nw-test-refactoring-catalog.SKILL.md
name: nw-test-refactoring-catalog
description: Detailed refactoring mechanics with step-by-step procedures, and test code smell catalog with detection patterns and before/after examples
user-invocable: false
disable-model-invocation: true

Test Refactoring Catalog

Test Code Smells (Full Detail)

L1 Readability Smells

Obscure Test

  • **Problem**: test name does not reveal business scenario being tested
  • **Detection**: generic names like Test1(), ProcessOrderTest(), or names requiring reading test body to understand
  • **Solution**: rename to Given_When_Then or should_do_expected_thing_when_condition format
Before: public void Test1() { /* ... */ }
After:  public void ProcessOrder_PremiumCustomer_AppliesCorrectDiscount() { /* ... */ }

Hard-Coded Test Data

  • **Problem**: magic numbers and strings obscure business rules being tested
  • **Detection**: numbers like 1000, 0.15, strings without explanation
  • **Solution**: extract to named constants that reveal business meaning
Before: Assert.Equal(850, result.Total);  // What discount?
After:  const decimal EXPECTED_TOTAL = 1000 * (1 - 0.15m);
        Assert.Equal(EXPECTED_TOTAL, result.Total);

Assertion Roulette

  • **Problem**: multiple assertions without messages make failures unclear
  • **Detection**: multiple Assert.* calls without message parameter
  • **Solution**: add descriptive message to each assertion explaining expected business outcome

L2 Complexity Smells

Eager Test

  • **Problem**: single test verifies multiple unrelated behaviors
  • **Detection**: multiple arrange/act/assert cycles or assertions testing different concerns
  • **Solution**: split into focused tests, one per business scenario
Before: ProcessOrderTest() { /* tests discount AND shipping AND tax */ }
After:  ProcessOrder_AppliesDiscount()
        ProcessOrder_CalculatesShipping()
        ProcessOrder_CalculatesTax()

Prefer parameterized tests for variations of the same behavior.

Test Code Duplication

  • **Problem**: repeated test setup logic across multiple tests
  • **Detection**: same object creation, mock setup, or data builders copied in 3+ tests
  • **Solution**: extract helper methods
Extract: CreatePremiumCustomer(), CreateHighValueOrder()

Conditional Test Logic

  • **Problem**: if/switch statements in test code make tests non-deterministic
  • **Detection**: if, switch, for loops in test methods
  • **Solution**: replace with parameterized tests

Python illustration (pytest binding; use the native table/parameterized-test facility elsewhere):

# Before: if/else in test
# After:
@pytest.mark.parametrize("input,expected", [...])
def test_behavior(input, expected): ...

L3 Organization Smells

Mystery Guest

  • **Problem**: test depends on external files or hidden dependencies
  • **Detection**: File.ReadAllText, database queries, external config in tests
  • **Solution**: inline test data or make dependency explicit in test setup

Test Class Bloat

  • **Problem**: single test class contains tests for multiple unrelated concerns
  • **Detection**: test class with 15+ tests covering different features
  • **Solution**: split by feature
Before: UserServiceTests (31 tests)
After:  UserAuthTests, UserProfileTests, UserNotificationTests

General Fixture

  • **Problem**: shared fixture used by tests with different needs
  • **Detection**: SetUp method creates data used by only some tests
  • **Solution**: move to per-test setup methods or test-specific fixtures

For production code refactoring techniques and mechanics, load the progressive-refactoring skill.

Read more
@nwave-ai
Ships withnwave

AI agents that guide you from idea to working code, with human judgment at every gate. nWave runs inside Claude Code. It breaks feature delivery into seven waves (discover, diverge, discuss, design, devops, distill, deliver).

628151 skills34 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
628
Star history of nWave-ai/nWave on GitHub, a chart by star-history.com

Other skills on nwave.

nw-ad-critique-dimensions

nw-ad-critique-dimensi…

Review dimensions for acceptance test quality - happy path bias, GWT compliance, business language purity, coverage completeness,…

@nwave-ai@nwave-aiInstall Skill
nw-agent-testing

nw-agent-testing

5-layer testing approach for agent validation including adversarial testing, security validation, and prompt injection resistance

@nwave-ai@nwave-aiInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about nw-test-refactoring-catalog.

Which coding agents can use nw-test-refactoring-catalog?
nw-test-refactoring-catalog installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.