When doing anything concurrently and/or in parallel, it is always good to have an input queue and an upper bound on the number of tasks (/threads/processes/...). Also an asynchronous flow.
You need to handle other problems (back-pressure, priorities, timeouts, ...) but if you need it you need it.
You don't need to write your own and test it -- use something like GNU parallel (if your tests can be run individually as commands or shell scripts) or a test framework that supports parallelism.
You need to handle other problems (back-pressure, priorities, timeouts, ...) but if you need it you need it.