Hi Chris,
This specific test is easy to write (mock first to return a resolved future, 2nd to block and 3rd to assert False)
OTOH complexity of the general case is unbounded and generally exponential. It's akin to testing multithreaded code.
(There's an academic publication from Microsoft where they built a runtime that would run each test really many times, where scheduler is rigged to order runnable tasks differently on each run. I hope someone rewrites this for asyncio)
Certainty [better] tools are needed, and ultimately it's a tradeoff between sane/understable/maintainable tests and testing deeper/more corner cases.
Just my 2c...