Veritas reveals which tested branches really catch faults in Java
Covered Is Not Checked: Which Branch Outcomes Would Your Tests Notice?
Software Engineering
Summary
Knowing which parts of software get run by tests isn't the same as knowing if those tests can find bugs. The authors introduce Veritas, a method that checks if tests truly notice when certain code choices are changed. Veritas changes covered decisions in the program to see if tests fail as they should, revealing many cases where tests run code but miss faults. This method works without heavy program analysis and shows which code parts are weakly tested and more prone to hidden bugs.
What this means in practice
- •For software testers: Identify which parts of tested Java code actually detect faults beyond just being run by tests.
- •For software qa teams: Improve test reliability metrics by focusing on outcomes that Veritas shows are truly checked by existing tests.
- •For automated testing tool developers: Incorporate Veritas’s mutation-based checking into test coverage tools to reveal hidden weak points in test suites.$Commercial implications: This paper’s approach enables tools to offer more precise fault detection metrics to software teams, improving test quality analysis.
Authors
Md Nafiu Rahman, Cemil Canbaz, Soneya Binta Hossain
Abstract
Code coverage reports what tests execute, not whether tests detect faults. Checked coverage addresses this gap by tracing code that influences test oracles through dynamic slicing, but slicing is costly, and Java slicers struggle with modern language features and complex programs. We present Veritas, a slicing-free approach that directly tests whether covered behavior is checked. We target object branch coverage (OBC), a compiled-code structural criterion with fault-detection effectiveness comparable to source-level Modified Condition/Decision Coverage (MC/DC), which is required at the highest assurance level of DO-178C. For each covered object-branch outcome, Veritas forces the opposite outcome and credits checking only when the change is executed, a previously passing test fails, and the failure is attributable to that outcome. Thus, Veritas distinguishes execution from demonstrated fault detection without dynamic dependence analysis. We evaluated Veritas on eleven open-source Java projects containing 51,382 object-branch outcomes. We find that 18% of covered outcomes can be changed without failing any test, exposing weaknesses hidden by coverage. Among surviving mutants, about half are never activated by test inputs, while the rest are activated but undetected. Compared with slicing-based checked coverage, Veritas identifies 4,763 cases where tests detect a change that slicing does not credit, while 19% of cases credited by slicing produce no detected failure when changed. Weakening assertions increases this gap and reduces fault detection in every project. Moreover, code locations controlled by weakly checked outcomes are 12.4--54.7 percentage points more likely to have an undetected independent fault than locations controlled by checked outcomes. These findings show that directly testing outcomes provides actionable evidence of oracle effectiveness beyond structural coverage.