test(acl): add Stryker config + mutation make target recording the 95% baseline (refs #47)
Configure Stryker.NET for the ACL in solution mode (Acl.slnx), so both Acl.Application and Acl.Infrastructure — the two projects under test — are mutated while Acl.Api (untested) is skipped. Record the repo-wide mutation baseline as the ratchet (CLAUDE.md §5): observed score 95%, enforced break threshold 90% (one-mutant headroom over the ~20-mutant surface). The ACL is the first service with branching logic, so it sets the baseline; later slices ratchet it up deliberately, never down. Add a `mutation` make target (`dotnet tool restore` + `dotnet stryker`) and wire it into the `make ci` aggregate, keeping `make ci` an exact mirror of the pipeline. Refs #47. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
15
Makefile
15
Makefile
@@ -43,10 +43,10 @@ export DOCKER_HOST := unix://$(PODMAN_SOCK)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: ci lint build unit smoke up down local local-down changelog openzaak-up openzaak-smoke openzaak-seed openzaak-down stack-up stack-smoke stack-down keycloak-up keycloak-smoke keycloak-down flowable-up flowable-smoke flowable-down help
|
.PHONY: ci lint build unit mutation smoke up down local local-down changelog openzaak-up openzaak-smoke openzaak-seed openzaak-down stack-up stack-smoke stack-down keycloak-up keycloak-smoke keycloak-down flowable-up flowable-smoke flowable-down help
|
||||||
|
|
||||||
## ci: run the full pipeline — lint, build, unit, smoke (mirrors Gitea Actions)
|
## ci: run the full pipeline — lint, build, unit, mutation, smoke (mirrors Gitea Actions)
|
||||||
ci: lint build unit smoke
|
ci: lint build unit mutation smoke
|
||||||
|
|
||||||
## lint: verify formatting (no changes)
|
## lint: verify formatting (no changes)
|
||||||
lint:
|
lint:
|
||||||
@@ -60,6 +60,15 @@ build:
|
|||||||
unit:
|
unit:
|
||||||
dotnet test $(SLN) -c Release
|
dotnet test $(SLN) -c Release
|
||||||
|
|
||||||
|
## mutation: run the Stryker.NET ratchet on the ACL (fails below the recorded baseline)
|
||||||
|
# Stryker is pinned as a local dotnet tool (.config/dotnet-tools.json); `tool restore`
|
||||||
|
# makes `make mutation` work from a fresh clone. Config + break threshold (the ratchet,
|
||||||
|
# CLAUDE.md §5) live in services/acl/stryker-config.json. The ACL is the first service
|
||||||
|
# with branching logic, so it sets the repo-wide baseline; later slices ratchet it up.
|
||||||
|
mutation:
|
||||||
|
dotnet tool restore
|
||||||
|
cd services/acl && dotnet stryker
|
||||||
|
|
||||||
## smoke: seed config, bring the whole stack up, wait for health-checked services, tear down
|
## smoke: seed config, bring the whole stack up, wait for health-checked services, tear down
|
||||||
# SEED populates the external config volumes first (upstream images used verbatim;
|
# SEED populates the external config volumes first (upstream images used verbatim;
|
||||||
# only our acl/bff are built). `up -d --build` starts EVERYTHING. Readiness is
|
# only our acl/bff are built). `up -d --build` starts EVERYTHING. Readiness is
|
||||||
|
|||||||
11
services/acl/stryker-config.json
Normal file
11
services/acl/stryker-config.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"stryker-config": {
|
||||||
|
"solution": "Acl.slnx",
|
||||||
|
"reporters": ["progress", "html"],
|
||||||
|
"thresholds": {
|
||||||
|
"high": 95,
|
||||||
|
"low": 90,
|
||||||
|
"break": 90
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user