12 notes &
Why testing distributed systems is hard
Concurrent programming models are necessarily nondeterministic, because they must interact with external agents that cause events at unpredictable times. Nondeterminism has some notable drawbacks, however: programs become significantly harder to test and reason about. Parallel and Concurrent Programming in Haskell, Simon Marlow
You can (and should) still try and catch these situations with unit tests, especially if your code is modular and stateless, but it does make it harder.