Test results are saved in test/functional/junit_results.xml (if you have better location, please propose it).
Here is part of output:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite failures="0" id="0" name="bitcoin_abc_tests" skipped="1" tests="65" time="227" timestamp="2018-02-13T06:11:18.717714">
<testcase classname="abandonconflict.py" name="abandonconflict.py" time="15">
<system-out>2018-02-13 11:09:07.161000 TestFramework (INFO): Initializing test directory /tmp/bitcoin_test_runner_20180213_060723/abandonconflict_604
2018-02-13 11:09:19.598000 TestFramework (INFO): If balance has not declined after invalidateblock then out of mempool wallet tx which is no longer
2018-02-13 11:09:19.598000 TestFramework (INFO): conflicted has not resumed causing its inputs to be seen as spent. See Issue #7315
2018-02-13 11:09:19.599000 TestFramework (INFO): 2489.99988480 -> 2489.99988480 ?
2018-02-13 11:09:19.599000 TestFramework (INFO): Stopping nodes
2018-02-13 11:09:21.816000 TestFramework (INFO): Cleaning up
2018-02-13 11:09:21.819000 TestFramework (INFO): Tests successful
</system-out>
<system-err/>
</testcase>
<testcase classname="abc-cmdline.py" name="abc-cmdline.py" time="8">
...
Unfortunately the test framework does not expose individual asserts/tests so we ouput one testcase per .py file (see abc-p2p-fullblocktest.py, which acutlaz runs 36 tests)
Ref t!&$