On Tuesday, 31 March 2015 at 09:08:47 UTC, Johannes Pfau wrote:
Am Mon, 30 Mar 2015 14:52:36 -0700
schrieb Andrei Alexandrescu <[email protected]>:

We're having a strong need for named unittests at Facebook for
multiple reasons.

Right now the default implementation works by putting pointers to a test function into ModuleInfo. We could instead add arrays of some 'unittest information' struct to ModuleInfo to support names etc. But we can't make this as extensible and powerful as it should be: In order to support arbitrary UDAs we'd always need some kind of UDA=>runtime
serialization.

Most powerful solution would be to simply put attributes for unittest blocks in runtime information for tests (using RTTI it should be possible to define such variadic structure in similar manner as D-style variadic function arguments).

The other option is getting a list of unittests at compile time.
(__traits allMEmbers, etc). AFAIK all unittest frameworks
supporting UDA use this approach. This is much more powerful and
extensible. It might make sense to switch the default implementation.

But here's the problem:

1) The compile time approach requires some kind
of explicit registration of the unittests. At least one mixin per
   module.
2) This mixin will usually provide a module constructor. But
using module constructors will cause issues with cycle detection.

This is not really true. You only need one mixin in the root module(s), rest can be iterated recursively by test runner itself using __traits(allMembers) reflection. Only issue with that approach is that last time I checked there was a DMD bug which prevented from getting complete list of imported modules via allMembers. Should be fixable.

And module constructors are not needed at all for this, there is http://dlang.org/traits.html#getUnitTests

Reply via email to