This really isn't a unit test any more, but it's still useful.
Good assertion messages are critical to identify the actual failing test
But these can slow down the tests
One failing test masks subsequent test failures.
If any bugs show up, those test cases can be pulled out into explicit individual tests for debugging.
Advanced trick: generate source code for the tests from the input data
Sometimes the integration tests find bugs the unit testing can miss. In particular, unitarity can mask reinitialization failures: