Low level unit test library in druntime

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 26 10:13:23 PDT 2016


I've been thinking lately about unit tests in D. The built-in support is 
a bit lacking. There's been many threads with this topic, even an 
attempt to get unit-threaded (or parts of it) into druntime/Phobos.

I was thinking, instead of trying to come up with a unit test framework 
that will satisfy everyone's wishes, we could create a low level unit 
test library in druntime. There are many styles of unit test frameworks 
available that look very different, but (as far as I know) most of them 
have very similar functionality and behavior. Although, not all of them 
may have all of the functionality.

The unit test library would provide functionality for registering test, 
before and after hooks, indicating test failures, running the tests and 
so on. This low level library can then be used to build different kind 
of unit test frameworks on top of. Be it something simple as what we 
have now in D, JUnit style or something like RSpec. The library would 
not provide functionality for finding/collecting the unit tests, that 
part is very framework dependent.

If this is added do druntime, we would update the existing runner to use 
this new library and (at least as a start) configure it to have the 
exact same behavior as the existing runner

To give a better idea of what I'm talking about, at the bottom is an 
example of how the API of the library could look like. Please don't 
focus on any details in the API, it only acts like any illustration to 
give a better understanding of the above descriptions.

Thoughts? Is this something we would like to have in druntime?

class UnitTester
{
     bool parallel;
     bool stopOnFirstFaliure;
     Formatter formatter;

     void beginTestGroup(string title = null, string file = null,
         size_t line = 0);
     void endTestGroup();

     void registerTest(void delegate() test, string title = null,
         string file = null, size_t line = 0);

     void registerTest(Context)(void delegate(Context) test, Context 
context,
         string title = null, string file = null, size_t line = 0);

     void registerBeforeSuiteCallback(void delegate() callback);
     void registerBeforeAllCallback(void delegate() callback);
     void registerBeforeEachCallback(void delegate() callback);

     void registerAfterSuiteCallback(void delegate() callback);
     void registerAfterAllCallback(void delegate() callback);
     void registerAfterEachCallback(void delegate() callback);

     void testFailed(Expected, Actual)(Expected expected, Actual actual);
     void testPassed();
     void testSkipped(string reason = null);
     void testPending(string reason = null);

     void runAll();
     void runSpecfic(string path, size_t line = 0);
     void runSpecfic(Regex regex, string path = null);
}

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list