I’ve used eForm with events functions for things like this before and it works very well. It’s a bit more complex to split up something like this into multiple pages using eForm, so I’ve usually created a tabbed interface on the page (using jQuery tabs or some other JavaScript/CSS tabs) to split it up without actually making it multiple pages. That way you don’t need to store anything in a session, cookie, or database table, and the scripting is a lot easier as a result.
Basically all you need to do is to write an eForm function that fires on the eFormOnBeforeMailSent event. You can check their answers and score the test in there, and you can set placeholders for the emails as well. Any new variables that you add to eForm’s $fields array automatically become placeholders that you can use in your email templates, e.g. if you have
$fields['test-score']=$score;
in your function (obviously after calculating the score and formating it properly), then you can just place [+test-score+] in your emails and it will be filled in automatically.
You can just change the questions and answers in your eForm template and function, or you could work up a module for managing those if they’ll need to be changed frequently by non-technical people. eForm validation doesn’t work as well for forms that are generated dynamically, but that may not matter in this case since people probably won’t submit more than once and if they leave a question blank or something that’s their tough luck. If you do need eForm validation to work completely then you’d probably want your module to generate the eForm chunk so that eForm could parse it properly, which would not be all that difficult to code but is a little bit more advanced than just changing it yourself.