make check fails
John Ralls
jralls at ceridwen.us
Thu Jun 13 23:03:26 EDT 2013
On Jun 13, 2013, at 10:16 AM, Christian Stimming <christian at cstimming.de> wrote:
> Am Donnerstag, 13. Juni 2013, 10:05:49 schrieb John Ralls:
>> You wrote in the commit message:
>> "Sigh. It turns out the utest-Split.c relies on the "warning" log level
>> in order to check for specific code paths. This sucks. The log level
>> "warning" should please be reserved for things that are actual warnings,
>> not for code path checks that are used in the unittests."
>>
>> That's not correct. utest-Split may rely on the presence of the message to
>> check the code path, and in order to do so needs to match the loglevel,
>> logdomain, and message string. If you change one of those in the tested
>> function, you just change it to match in the test and it should work. In
>> this case you want to change the "foo differ" warnings to infos. No big
>> deal, just change the loglevel in the tests to match.
>
> Hi John,
>
> the problem is that it's not sufficient to "just change it to match the test".
> I saw in utest-Split.c lines 424-428 how a set of loglevels was selected for
> various check counters. However, adding the G_LOG_LEVEL_INFO to the set of
> loglevels in line 424 doesn't work because other tests rely on exactly the
> chosen set of loglevels that are in use now. Changing the set of log levels
> solely for the checkC counter doesn't work either, because even this one
> relies on exactly only this set log level in some other code path tests.
> That's when I gave up and summarized this experienced in the quoted commit
> message.
Loglevel isn't a mask: It has to match exactly. It's only a variable to save typing
G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL everywhere and to
shorten line lengths. One could use
guint loglevel_info = G_LOG_LEVEL_INFO //g_tester doesn't make info messages fatal
or just use G_LOG_LEVEL_INFO directly in the two or three places it's needed.
>> Now, ideally unit tests would only be checking the message to make sure
>> that it's emitted: That's a side-effect of the function, and a unit test
>> should test all of the function's effects. Unfortunately most of the engine
>> consists of over-long functions with multiple code paths whose behavior is
>> difficult to test correctly coupled with excessive class interdependencies
>> . In order to be able to refactor them for better testability I have to
>> first get them tested somehow so that I'll know when I break something in
>> the refactor.
>
> I certainly agree the overly-long functions make unittesting even harder.
> Maybe I'm just not understanding the unittesting that includes checking for
> log output. In that case I'd appreciate if you change the PWARN into PINFO and
> correctly adapt the unittest. Thanks!
Unit tests should test a function's every behavior, and emitting messages is a behavior. What's
hard to understand about that?
I'll take care of it, but I can't promise that it will be in time for 2.5.3. BTW, Split.c needs the
same treatment. There are probably other places as well.
Regards,
John Ralls
More information about the gnucash-devel
mailing list