Two more: - Fuzz testing: randomising inputs to validate the mapping to expected outputs. - Mutation testing: changing code (`+` to `-`, `raise Foo` to `return`, etc.) to complement and validate the coverage metric.
To be fair, mutation testing checks the tests themselves, not the actual code. But yes, it is still a valuable tool in the QA arsenal.