Start here. This is the direct spoken answer to practice first.
Why this question matters
An async test can pass before the real work finishes or become timing-dependent when sleep is used as coordination. A useful test controls the boundary where cancellation or timeout matters and proves both the returned result and the absence of forbidden side effects.
The test returns Task and awaits the operation; I never use async void. For caller cancellation, I pass a token I own, wait until the operation reaches a known cancellable point, cancel it, and assert the documented outcome such as a canceled task or OperationCanceledException. I also assert state: no database commit, external call, retry, or queued work after cancellation. A product timeout is tested separately so it is not confused with caller cancellation or a test-runner timeout.