runTests() should throw meaningful error messages

Details

Description

When runTests() fails to validate the output generated by a mapper or reducer, it throws a RuntimeException with no message and relies on logging output to indicate what was wrong. Instead it should throw meaningful exceptions (although they can still be unchecked).