D Unittest shortcomings with DLLs

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Wed Mar 4 23:28:12 PST 2015

On 2015-03-03 18:49, Benjamin Thaut wrote:
> I'm currently in the process of annotating all of phobos with "export"
> and its quite cumbersome. To verify that I annoted all relevant
> functions and types with export I would like to run the unitests against
> the shared version of phobos. There is a problem with this though. The
> unittests are always compiled into the same binary the modules are in so
> the unittests would end up in the phobos.dll and would not test phobos
> across a shared library boundary. It would also be very usefull to have
> this verifycation for the future when DLL support is officially in and
> new features need to be tested if they are propperly annotated with
> "export". Once "export" is used for shared library symbol visibility on
> non-windows as well this will be an issue on all pattforms.
> The best solution would be if you could simply compile the unittests and
> just the unittests into a executable. This would require some compiler
> modifications, but even when done would cause some problems:
> - Unittests may use private functions / types of a module. Private
> functions and types are however not exported from an shared library so
> this would require making a lot of private functions / types public just
> to be able to run the unittests.
> Instead of building this into the compiler you could use a tool which
> extracts all "unittest { }" blocks out of all source files and puts them
> into new .d files. Then compile these into an executable. Now the code
> would not even compile because private symbols would not be accessible.
> Any suggestions how to fix this issue? I'm also open for implementation
> hints.

Sounds like you want to test an application that uses Phobos as a DLL. 
To me that sounds like a more higher level test than a unit test, i.e. 
integration tests. I would put those tests in completely separate files, 
in a separate testing directory. Then it should be no problem to compile 
the parts separately.

As for private functions. That is more a question of if you really 
should write specific test for those or just test the public API. If you 
really want to, you can bypass the protection using pointers.

BTW, I think we need to have integration tests in general. Testing how 
different parts/modules interact with each other.

/Jacob Carlborg

More information about the Digitalmars-d mailing list