Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.c++.moderated    |    Moderated discussion of C++ superhackery    |    33,346 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 32,769 of 33,346    |
|    Balog Pal to Dave Abrahams    |
|    Re: Unit Testing Frameworks (was Re: Sin    |
|    30 Dec 12 00:28:01    |
      From: pasa@lib.hu              On 12/28/2012 10:34 PM, Dave Abrahams wrote:       >> This is the nub of the argument, but nothing posted so far backs up       >> the assertion. The preceding posts all demonstrate the use of       >> different loggers.       >       > It seems self-evident to me, but I'll try to explain anyway.       >       > * Most singletons are designed not to allow arbitrary lifetime       > management at all, so you can only have one during the life of the       > executable              Not really. One important part of this thread was exactly on this.       Singleton is a *design* pattern, that is about summoning an object that       *behaves* as the same throughout the specified time-region, and every       client can build on that fact.              The rest is implementation detail. It may really a single instance be       created early and kept for long, or may use any other magic.              And importantly it is about the designated object, not its class, so the       usual struggle to make a "singleton class" that focuses to *prevent*       multiple instances creation are way off track. And are only good to       shadow those working on the original goal for special cases.              For the big majority of the cases the simplest way works: you have a       regular class that does the job, and a global function deals with the       summoning stuff. Separating the responsibilities as in the book -- and       allowing different combinations.              Also, the "specified time-region" is not direct-mapped to "life of the       executable". IME the latter is pretty rare case, the most usual period       is after-appinit-is-done through until-shutdown-initiated. (Extending       that needs special treatment, careful planning and documentation;       fortunately not needed that often.)       And there's no problem to set it 'from start to finish of that test       case' either.              > * In any case, only one instance of a singleton can exist at a given       > time, by definition              Of the singleton object, sure -- but that poses no problems at all. You       keep thinking in the must-be-a-class terms.              But even with a class packed solution it need not be a testing problem,       as you can force creation at start of case and erase it at the end of       it. Next case will start afresh.              The only test scenario hurt is the one we already discussed, if you       launch the cases in multiple threads instead of sequentially.              > * Therefore if you have two tests that need to talk to different loggers       > they either must be in separate executables (in the first case) or at       > least can't run in separate threads (in the second case).       >       > What am I missing?              The last point is correct formally. But IME it is hardly a practical       problem, because:              * when the program is generally not thread-aware, MT tests tests will       not fit the picture              * when the program is thread-aware, and uses singletons, those will be       even more thread-aware. and though you can not separate the instances       the test will do its job fine              I agree that you can find a few test cases where you actually look into       the singleton's state as well, and need to use the original, but it is a       small minority. That can be "packaged" separately for either build or       just execution.              * thinking of systems I saw that had actual tests, there were many units       many dozens of executables even for small LOC ones. It looks impractical       to struggle multithreading on this level rather than on the suite level.              * as already mentioned IME singletons are normally found in Application       part and rare in Library parts (for a ton of trivial reasons). And       application testing is way tricky in its own right let alone making it       parallel internally.                     So in summary, I don't mind an assertion like 'singletons, in SOME rare       cases can hurt a MULTITHREADED approach of testing', but extrapolating       that to a general test-hindering is IMNSHO just @#$@!#$!@.                     --        [ See http://www.gotw.ca/resources/clcm.htm for info about ]        [ comp.lang.c++.moderated. First time posters: Do this! ]              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca