If you have so many tests, why wouldn't you generate a single executable which takes the name of the test as an argument and runs that test?
Something like the following, with additional error checking and etc.
data Test = Foo | Bar | ...
runTest :: Test -> IO ()
main = do
(t:_) <- getArgs
runTest (read t)
This is a pretty simple idea, just wanted to know why you don't go down this path instead.
HTH,
Ozgur