Under ideal conditions, I would assume a test failure means the report would either be incomplete or not useful isn't it?
AFAIK there isn't a post-build job for a stage, you can do it at a job level though using "Run If" Attribute of the tasks. Here are a few ways to get what you need, it might range from ugly to "Oh, that's interesting". If you do decide to choose these methods please drop a line so I know if it was useful :-)
Option 1:
Assuming you can tell from the reports if a test has failed or not, you just have a dummy task after the tests that runs on runif="any" and do the aggregation on the next stage. If you know from the reports something has failed you can always fail the aggregate stage with some useful information.
Cons: The failure will not immediately tell you what failed but again if the folks who need to view the error have access to GoCD logs they can always view the error and take necessary actions.
Option 2:
Very similar to Option 1, but if you can't tell from the reports if a test has failed then you can emit an artifact that says if a test has failed or not and then do the same in the aggregate stage to parse these artifacts and then decide to fail the stage.
Cons: If the previous option wasn't ugly enough, this definitely feels that way for me.
Option 3:
Have a separate stage after the tests that does the aggregation, instead of doing all the gymnastics with artifacts or run if attributes, you can write a notification plugin that listens to only failure events of this stage and then manually trigger the next stage.
Cons: Effort to writing to a plugin and maintaining it. Let me know if you are comfortable contributing this to the
gocd-slack-notifier plugin. Happy to collaborate on this if required too.
Thanks,