I'm not particularly fond of this interface and think that a solution with a delegate / lazy or alias template parameter would be more convenient. However, until we have ast macros I do see the added value in this approach.
Some remarks about the api, not a proper review of the code itself: - core.exception and std.string must be imported to use the module, relevant symbols should be selectively and publicy imported instead. - exception would be better abbreviated as ex instead of exc, I believe this is more conventional. (assertExThrown instead of assertExcThrown) - assertExcThrown should fail if an exception is thrown that is not T or a subclass of T. (catch and throw AssertError) - assertEqual and assertNotEqual is inconsistent in naming with the assertOpFoo class of functions I believe these assertions should be added: - assertExcThrown and assertExcNotThrown with a default T (should be Exception, not Throwable) - something equivalent to std.algorithm.equal, the latter is very useful in unittests - assertOpBinary, assertTrue and perhaps assertPred (where the predicate is an template alias parameter)