Source profileQuality 96/100

vasilyu1983/AI-Agents-public/frameworks/shared-skills/skills/qa-testing-nunit/SKILL.md

qa-testing-nunit

Designs NUnit-based C# test suites for API, component, and integration coverage. Use when creating fixtures, wiring Testcontainers, or reducing flaky CI behavior.

Source repository stars
82
Declared platforms
2
Static risk flags
1
Last source update
2026-08-21
Source checked
2026-08-28

Decision brief

What it does: where it fits

Designs NUnit-based C# test suites for API, component, and integration coverage.

Best for

  • Use when creating fixtures, wiring Testcontainers, or reducing flaky CI behavior.

Not for

  • The question is "should we even have this test" (risk-based coverage priority, what to test at all) — use $qa-testing-strategy first, then return here for how to build it.
  • The failing thing is a dotnet test/MTP/VSTest runner-mode mismatch, coverage collector wiring, or CI target graph, not fixture/test code — use $ops-nuke-cicd; do not try to fix runner-mode drift by editing test files.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexDeclaredSource recordInstall path and trigger
Claude CodeDeclaredSource recordInstall path and trigger
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/vasilyu1983/AI-Agents-public --skill "frameworks/shared-skills/skills/qa-testing-nunit"
Safe inspection promptEditorial

Inspect the Agent Skill "qa-testing-nunit" from https://github.com/vasilyu1983/AI-Agents-public/blob/53f6cb73ea53a2646e3e7d4665062ad66f3683ac/frameworks/shared-skills/skills/qa-testing-nunit/SKILL.md at commit 53f6cb73ea53a2646e3e7d4665062ad66f3683ac. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Quick Start

    1. Classify test scope: API, component, or integration. 2. Lock runtime constraints: Docker availability, framework target, and excluded suites. 3. Choose fixture pattern: one fixture per controller or handler family. 4. Wire dependencies: Testcontainers for databases, WireMock…

    Classify test scope: API, component, or integration.Lock runtime constraints: Docker availability, framework target, and excluded suites.Choose fixture pattern: one fixture per controller or handler family.
  2. 02

    Workflow

    1. Define boundary, dependencies, expected assertion depth, and environment constraints. Load references/nunit-structure.md. If the request touches dotnet test, runner mode, adapters, or CLI flags, also load references/test-platform-modes.md. 2. Select fixture composition and li…

    Define boundary, dependencies, expected assertion depth, and environment constraints.Select fixture composition and lifecycle.Implement scenario tests for the target layer.
  3. 03

    Quick Reference

    Classify test scope first: API, component, or integration.

    Classify test scope first: API, component, or integration.Lock runtime constraints before execution: Docker availability, framework target, and explicitly excluded suites.If the task mentions dotnet test, Microsoft.Testing.Platform, global.json, adapters, or coverage/logging switches, verify the repo's current runner mode first and use current primary sources from data/sources.json.
  4. 04

    Current-Facts Protocol

    Treat runner mode, package versions, analyzer behavior, adapter requirements, and CLI/coverage switches as volatile current-state facts.

    Treat runner mode, package versions, analyzer behavior, adapter requirements, and CLI/coverage switches as volatile current-state facts.Verify version-sensitive guidance against data/sources.json before recommending package changes or command-line flags.Keep repository-wide dotnet test, MTP, coverage, and CI wiring in $ops-nuke-cicd; keep this skill focused on fixture design and suite structure.
  5. 05

    Templates

    NUnit Handler Fixture Template: base fixture for setup wiring and deterministic scenario configuration.

    NUnit Handler Fixture Template: base fixture for setup wiring and deterministic scenario configuration.NUnit Handler Tests Template: base test class using fixture with Arrange/Act/Assert flow.NUnit API Fixture Template: API fixture for controller-focused API-to-database full-cycle tests.

Permission review

Static risk signals and limitations

Network access

medium · line 88

The documentation includes network, browsing, or remote request actions.

[NUnit API Request Builder Template](assets/nunit-api-request-builder-template.cs): deterministic request builder for scenario setup.

Network access

medium · line 144

The documentation includes network, browsing, or remote request actions.

Use web search or web fetch to verify current external facts, versions, pricing, deadlines, regulations, or platform behavior before final answers.

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score96/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars82SourceRepository attention, not individual Skill quality
Compatibility2 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
vasilyu1983/AI-Agents-public
Skill path
frameworks/shared-skills/skills/qa-testing-nunit/SKILL.md
Commit
53f6cb73ea53a2646e3e7d4665062ad66f3683ac
License
MIT
Collected
2026-08-28
Default branch
main
View the original SKILL.md

QA Testing (NUnit)

Quick Start

  1. Classify test scope: API, component, or integration.
  2. Lock runtime constraints: Docker availability, framework target, and excluded suites.
  3. Choose fixture pattern: one fixture per controller or handler family.
  4. Wire dependencies: Testcontainers for databases, WireMock for external services.
  5. Run iteratively: code → build → dotnet test → fix → repeat.

Quick Reference

  • Classify test scope first: API, component, or integration.
  • Lock runtime constraints before execution: Docker availability, framework target, and explicitly excluded suites.
  • If the task mentions dotnet test, Microsoft.Testing.Platform, global.json, adapters, or coverage/logging switches, verify the repo's current runner mode first and use current primary sources from data/sources.json.
  • Use this skill for test-suite architecture and fixture behavior, not for general service implementation or CI graph refactors.
  • Default to two files per handler/use case: <Feature>Fixture.cs and <Feature>Tests.cs.
  • For full-cycle API tests, use controller-focused structure: one fixture per controller/test family and one base ApiTest.cs + ApiFixture.cs (split by scenario family only when needed).
  • Do not translate SpecFlow/Taffy step definitions into C# line-by-line; rewrite scenario intent into idiomatic API tests.
  • For API migrations, avoid one global shared setup fixture; each controller/test family fixture owns its own dependencies.
  • Fixture ownership for API tests should include DB launcher + migrators + WireMock + WebApplicationFactory + client.
  • Keep API fixture-shared runtime parallel-safe: fixture-level parallelism is fine, but do not enable child-test parallelism when WireMock stubs, clients, or mutable runtime state are shared.
  • Why [FixtureLifeCycle(LifeCycle.InstancePerTestCase)] pairs with [Parallelizable]: NUnit's default SingleInstance lifecycle shares one fixture object across every test method, so instance fields become a race condition the moment two of its tests run concurrently. InstancePerTestCase gives each test its own instance, isolating instance-field state; it does not isolate static fields or external shared resources (containers, WireMock servers), which is why [OneTimeSetUp]/[OneTimeTearDown] must stay static under this lifecycle and shared runtime still needs its own reset discipline in [SetUp].
  • Reset mutable state in [SetUp]; dispose all owned infra in [OneTimeTearDown].
  • For DB bootstrapping, use the DatabaseLauncher + MigratorContainer pattern (see assets/nunit-database-launcher-template.cs); if the repo already has an established launcher/migrator helper, follow it instead of forking.
  • Use whatever migrator command the repo's existing migrator container exposes (e.g. migrateup -m /sql); avoid custom ready-check arguments inside tests — drive readiness from the container wait strategy.
  • Keep migrator ordering explicit (dependency migrators first, domain migrator last) and support fixture-level optional migrator toggles when some suites do not need all DBs.
  • Add explicit migrator verification tests that assert launcher startup, migrator completion/order, and required tables.
  • Use iterative quality loop: code -> build -> run tests -> fix -> repeat.
  • For health endpoints, use [Test] + [TestCase] + [CancelAfter(...)] with method signature (string url, CancellationToken cancellationToken); keep [Test] together with [TestCase] to avoid NUnit analyzer issues.
  • Prefer analyzer-friendly NUnit usage and richer diagnostics: use Assert.Multiple or Assert.EnterMultipleScope for related assertions, and use TestContext.Progress or fixture diagnostics when failures need more context.
  • If user excludes infra-dependent suites (for example component tests requiring Docker), run feasible categories first and report exactly what remains unvalidated.
  • If the task shifts into service design or backend refactoring, switch to $software-csharp-backend.
  • If the task shifts into nuke/Build.cs, test runner selection, category target wiring, or CI artifact publication, switch to $ops-nuke-cicd.

Current-Facts Protocol

  • Treat runner mode, package versions, analyzer behavior, adapter requirements, and CLI/coverage switches as volatile current-state facts.
  • Verify version-sensitive guidance against data/sources.json before recommending package changes or command-line flags.
  • Keep repository-wide dotnet test, MTP, coverage, and CI wiring in $ops-nuke-cicd; keep this skill focused on fixture design and suite structure.
  • Current stable versions (verified 2026-06-09): NUnit 4.6.1, NUnit3TestAdapter 6.2.0, NUnit.Analyzers 4.14.0.
  • NUnit 4 minimum TFM: .NET Framework 4.6.2 or .NET 6.0.
  • NUnit3TestAdapter 6.x supports MTP 2.0 and requires .NET 8+; adapter 5.x supports MTP 1.x with .NET Core 3.1+.
  • dotnet test has two modes: VSTest mode (default, .NET 9 SDK and earlier) and MTP mode (opt-in via global.json, .NET 10 SDK). Running MTP under VSTest mode is legacy as of .NET 10.
  • FluentAssertions v8 is commercially licensed (Xceed); new repos must use NUnit constraints, Shouldly, or AwesomeAssertions.
  • coverlet.collector is VSTest-only; use coverlet.MTP or Microsoft.Testing.Extensions.CodeCoverage for MTP mode.

Workflow

  1. Define boundary, dependencies, expected assertion depth, and environment constraints. Load references/nunit-structure.md. If the request touches dotnet test, runner mode, adapters, or CLI flags, also load references/test-platform-modes.md.
  2. Select fixture composition and lifecycle. Load references/fixture-pattern.md and references/testing-templates.md.
  3. Implement scenario tests for the target layer. Load references/api-testing-nunit.md or references/component-testing-nunit.md.
  4. Choose double vs real dependency strategy. Load references/dependency-strategy-matrix.md, then references/wiremock-setup.md or references/testcontainers-setup.md.
  5. Add resilient async and eventual-consistency assertions. Load references/async-eventual-assertions.md and references/assertions-and-diagnostics.md.
  6. Harden suite against flaky behavior. Load references/anti-flakiness.md.
  7. Tune execution in CI. Load references/ci-parallelism-sharding.md and references/infrastructure-troubleshooting.md.
  8. Validate changed suites through build-test feedback targets. For NUKE-based repositories, run BuildAll, LocalUnitTest, ApiTest/DbTest as needed, then TestAll; use $ops-nuke-cicd for pipeline-target changes.
  9. If this is a migration from SpecFlow-style assets, produce migration trace artifacts. Use $docs-codebase with migration matrix and feature trace templates.

Resources

Templates

ASCII Flow

NUnit testing request
  -> Classify API, component, integration, or infrastructure-backed scope
  -> Verify runner mode, target framework, Docker availability, and excluded suites
  -> Choose fixture shape and dependency strategy: real, fake, WireMock, Testcontainers
  -> Add deterministic Arrange/Act/Assert tests with rich diagnostics
  -> Run dotnet build/test with targeted filters before widening
  -> Fix flakes through isolation, readiness checks, and parallelism boundaries

Navigation

  • ## Workflow and ## Quick Reference for the baseline sequence
  • ## Resources and ## Templates for deeper materials
  • ## When Not to Use This Skill and ## Failure Triage for scope boundaries and symptom-first debugging
  • ## Related Skills for broader QA and .NET handoffs

When Not to Use This Skill (Judgment Calls)

  • The question is "should we even have this test" (risk-based coverage priority, what to test at all) — use $qa-testing-strategy first, then return here for how to build it.
  • The failing thing is a dotnet test/MTP/VSTest runner-mode mismatch, coverage collector wiring, or CI target graph, not fixture/test code — use $ops-nuke-cicd; do not try to fix runner-mode drift by editing test files.
  • The task is implementing or fixing production/service code exposed by a failing test — switch to $software-csharp-backend; writing tests around a bug is this skill's job, fixing the bug is not.
  • The suite in question is browser/E2E (Playwright, Selenium) rather than API/component/integration in-process or Testcontainers-backed — use $qa-testing-playwright or the relevant mobile/UI skill instead.
  • A flaky test's root cause is unclear after one pass of references/anti-flakiness.md — do not keep guessing fixes; add diagnostics (correlation IDs, container/WireMock logs, timing) first, reproduce deterministically, and only then patch. Silently adding [Retry] to hide an unexplained flake is a regression, not a fix.

Failure Triage (Symptom → Likely Cause → First Move)

SymptomLikely cause classFirst move
Test passes alone, fails in full runShared mutable state or fixture lifecycle mismatchCheck [FixtureLifeCycle]/[Parallelizable] combination; confirm [SetUp] actually resets everything the failing test reads
Test passes locally, fails only in CIPort collision, Docker host assumption (localhost vs remote Docker host), or resource contention under CI parallelismCheck for hard-coded ports/hosts (references/anti-flakiness.md, references/testcontainers-setup.md); reduce parallelism for the failing category as a diagnostic, not a permanent fix
Intermittent timeout on eventually-consistent assertionsFixed sleep instead of polling, or timeout too tight for CI-under-loadReplace with the polling template in references/async-eventual-assertions.md; widen timeout only after confirming the condition is correct, not to paper over a race
dotnet test silently discovers 0 tests after an upgradeAdapter major version mismatched to MTP generation, or mixed VSTest/MTP in one solutionCheck adapter ↔ MTP ↔ TFM matrix in references/test-platform-modes.md before touching test code
Coverage report is empty or missing after enabling MTPcoverlet.collector/coverlet.msbuild left in place (VSTest-only, silently no-ops under MTP)Swap to coverlet.MTP or Microsoft.Testing.Extensions.CodeCoverage per references/test-platform-modes.md
Migrator-dependent test fails with a missing-table errorMigrator ordering issue, not a test bugCheck references/infrastructure-troubleshooting.md migrator-ordering section before adding retries or longer timeouts

Related Skills

SkillPurpose
software-csharp-backendBackend service implementation
ops-nuke-cicdNUKE pipeline targets and CI wiring
dev-structured-logsStructured logging migration
qa-testing-strategyRisk-based test strategy
qa-testing-playwrightBrowser/E2E suites (out of scope here)

Fact-Checking

  • Known bugs, regressions, framework/compiler/runtime footguns, and version-specific crash or workaround guidance must be verified against current primary web sources before being treated as current fact.
  • Use web search or web fetch to verify current external facts, versions, pricing, deadlines, regulations, or platform behavior before final answers.
  • Prefer primary sources; report source links and dates for volatile information.
  • If web access is unavailable, state the limitation and mark guidance as unverified.

Learnings Loop

Before applying this skill on a non-trivial task, read learnings.consolidated.md in this directory (and learnings.md if present).

After applying it, if you encountered a pattern worth remembering, a mistake worth preventing, or a domain fact that surprised you, append one dated bullet to learnings.md via agents-skills-feedback-loop/scripts/append_learning.py. Do not modify SKILL.md itself.

Frequently asked questions

What to verify before installation and use

What does the qa-testing-nunit source document cover?

Designs NUnit-based C# test suites for API, component, and integration coverage.

How do I install qa-testing-nunit?

The source record exposes this install command: npx skills add https://github.com/vasilyu1983/AI-Agents-public --skill "frameworks/shared-skills/skills/qa-testing-nunit". Inspect the command and pinned source before running it.

Which Agent platforms does the source record declare?

The pinned source record declares support for: codex, claude code.

Which permission-related actions were detected?

Static rules flagged network in the source; the page lists the matching lines and excerpts.

Alternatives

Compare before choosing

Computed 99211

PramodDutta/qaskills

Resume ATS Optimizer

Optimize resumes for Applicant Tracking Systems, check ATS compatibility, and analyze keyword match

Computed 9982

vasilyu1983/AI-Agents-public

qa-testing-ios

Guides iOS testing with XCTest, XCUITest, Swift Testing, simctl, and xcresult. Use when choosing destinations, controlling flakes, or parsing test artifacts for native apps.

Computed 973,094

samber/cc-skills-golang

golang-testing

Production-ready Golang tests — table-driven tests, testify suites and mocks, parallel tests, fuzzing, fixtures, goroutine leak detection with goleak, snapshot testing, code coverage, integration tests, idiomatic test naming. Use when writing or reviewing Go tests, choosing a testing approach, setting up Go test CI, or debugging flaky/slow tests. For testify-specific APIs see `samber/cc-skills-golang@golang-stretchr-testify`; for measurement methodology see `samber/cc-skills-golang@golang-benchm

Computed 973,094

samber/cc-skills-golang

golang-troubleshooting

Troubleshoot Golang programs systematically - find and fix the root cause. Use when encountering bugs, crashes, deadlocks, or unexpected behavior in Go code. Covers debugging methodology, common Go pitfalls, test-driven debugging, pprof setup and capture, Delve debugger, race detection, GODEBUG tracing, and production debugging. Start here for any 'something is wrong' situation. Not for interpreting profiles or benchmarking (→ See `samber/cc-skills-golang@golang-benchmark` skill) or applying opt