Home / Concepts / Verification
Verification¶
ProTest includes a comprehensive verification framework that confirms the correctness of generated covering arrays. Verification checks four aspects of the results — including one of ProTest's most powerful features: transitive constraint analysis.
Coverage Verification¶
Confirms that every t-way tuple of parameter values appears in at least one test case. This is the core guarantee of a covering array.
- Checks all tuples at the global interaction order
- Checks sub-model tuples at their specified orders
- Reports any missing tuples
Constraint Satisfaction¶
Confirms that every test case in the results satisfies all defined constraints. No row should violate any constraint.
- Evaluates each constraint against each row
- Supports the full constraint language (IF/THEN/ELSE, comparisons, logical operators)
- Reports any constraint violations with the specific row and constraint
Seed Inclusion¶
Confirms that all seeded test cases appear in the results.
- Complete seeds must appear exactly as specified
- Partial seeds must have all specified values present in at least one row
- Reports any missing seed matches
Transitive Constraint Analysis¶
PICT Terminology
PICT internally calls these "derived exclusions" — its ExclusionDeriver resolves all constraints (including their interactions) into a flat list of forbidden parameter-value combinations. ProTest surfaces this concept as transitive constraints and goes further by showing you exactly which constraints chain together to create each derived exclusion.
This is one of ProTest's standout features. When you define constraints, they can interact with each other to create implied exclusions that you never explicitly wrote. ProTest's verification framework detects these transitive constraints and shows you the chain of reasoning.
How It Works¶
Consider a model with three parameters:
| Parameter | Values |
|---|---|
| Database | MySQL, PostgreSQL |
| Cache | Redis, Memcached |
| Queue | RabbitMQ, Kafka |
Now add two constraints:
IF [Database] = "MySQL" THEN [Cache] <> "Memcached";
IF [Cache] = "Redis" THEN [Queue] <> "Kafka";
You wrote two constraints, but there is a hidden third one. Here's the chain:
- If Database = MySQL, then Cache must be Redis (because the first constraint excludes Memcached)
- If Cache = Redis, then Queue must be RabbitMQ (because the second constraint excludes Kafka)
- Therefore: If Database = MySQL, then Queue cannot be Kafka — even though you never wrote that constraint
The tuple (Database=MySQL, Queue=Kafka) will be missing from the covering array. Without transitive analysis, this would look like a bug — a missing tuple that should have been covered. But ProTest's verification recognizes it as a transitive constraint and reports it as such, showing you exactly which constraints interact to make this combination infeasible.
What You See in the UI¶
When you run verification (Ctrl+Shift+V), ProTest analyzes any missing tuples and classifies them:
- Direct constraint — A single constraint explicitly forbids this combination
- Transitive constraint — Multiple constraints interact to make this combination infeasible. ProTest shows which constraints are involved and how they chain together.
If all missing tuples are explained by direct or transitive constraints, the coverage check still passes — the tuples are missing for valid reasons, not due to a generation bug.
Why This Matters¶
In real-world models with dozens of constraints, transitive interactions are easy to miss. You might have 15 constraints that individually look reasonable, but together they create dozens of implied exclusions you never intended. ProTest makes these hidden relationships visible, helping you:
- Understand your model — See the full picture of what your constraints actually exclude
- Debug unexpected results — When a tuple is missing, know whether it's a constraint interaction or a real problem
- Validate constraint logic — Discover unintended exclusions before they affect your testing
Running Verification¶
In the UI¶
Press Ctrl+Shift+V or click Verify in the toolbar. Results appear in the validation summary on the left sidebar, including any transitive constraints with their full chain of reasoning.
Programmatically¶
The verification framework is available in ProTest.Core through the CoveringArrayVerifier class, which orchestrates all checks including transitive constraint analysis via the TransitiveConstraintAnalyzer.
When Verification Fails¶
If verification reports issues:
- Missing coverage — Indicates a bug in the generation engine (rare). Try regenerating with a different seed.
- Missing coverage (transitive) — The tuple is infeasible due to constraint interactions. ProTest shows the constraint chain — this is expected behavior, not a bug.
- Constraint violation — The constraint may have been added after generation. Regenerate to include the new constraint.
- Missing seed — The seed may conflict with constraints. Check that the seeded values don't violate any constraint rules.