Firstly, Assertions are treated as booleans, so a test can encounter issues when the PASS/FAIL decision is formed on the basis of evaluating multiple conditions.
When I run into situations where a test case has to deal with multiple assertions, I consider implementing an approach that includes script logic so the test can make a more comprehensive pass/fail decision.
Consider the following example:
1) Initialize an error message property or multiple properties. During the test, as checks "fail" add information to these properties.
2) Flow through the test case, as errors occur concatenate error information in these properties. This allows the test to create a list of all the errors encountered during the test rather than just Failing the test when the first error is encountered.
3) When the test case flow ends, add a script step that evaluates the overall condition of the test and either passes or fails. In the Pass/Fail test case script, evaluate the properties. If the property is empty (""), return PASS. If the property contains error information, return "FAIL". Add an assertion to this step that ends the test if the script's LASTRESPONSE is PASS and fails the test case if the LASTRESPONSE is FAIL. The test can write the error output to the file system if necessary. The file contains a description of all of the various errors that were encountered during the test which can help in debugging and minimize overall test time.
Following is a fictitious example flow. The idea is that all of the potential error conditions are evaluated in a pass/fail step and the "list" of error conditions are appended to a failure report. Some of the errors are hard errors and end the test immediately (e.g., input comparison data is not found, or data is missing on the system of record).