When two implementations are supposed to compute the same thing — two compilers, two JSON parsers, a fast path and a slow path, a new version and the old — feed them the same inputs and look for the one where they disagree. You need no oracle: the disagreement itself is the bug (at least one of them is wrong). Differential testing turns “is this correct?” into “do these agree?” — a question you can answer by search.
Two implementations of a triangular sum — a reference recursion and a closed-form with a planted bug — are fed the same inputs. The checker returns the first input where they diverge: live demo
“Without a spec of the correct answer, you cannot test.” — you can, if you have two things that must agree. Their disagreement needs no oracle: it proves at least one is wrong. This is how the hardest software — compilers — is actually tested. cited
Two witnesses who must agree, and the case where they don't. No judge of truth is needed — only the contradiction, which convicts at least one of them. McKeeman 1998
On the canonical compiler, a reference sum and a closed-form with a bug planted at n=7 are compared over 1..50; the checker returns the first divergence: