> On Jun 30, 2016, at 17:36, Jean-Paul Calderone <exar...@twistedmatrix.com> 
> wrote:
> 
> On Thu, Jun 30, 2016 at 6:25 PM, Glyph Lefkowitz <gl...@twistedmatrix.com 
> <mailto:gl...@twistedmatrix.com>> wrote:
> 
>> On Jun 30, 2016, at 04:13, Jean-Paul Calderone <exar...@twistedmatrix.com 
>> <mailto:exar...@twistedmatrix.com>> wrote:
>> 
>> On Thu, Jun 30, 2016 at 6:43 AM, Adi Roiban <a...@roiban.ro 
>> <mailto:a...@roiban.ro>> wrote:
>> Hi,
>> 
>> Recently we have introduced a hard check of 100% coverage for all changes.
>> This is done via coverage + codecov + github protected branches.
>> 
>> Now, if your patch is not 100% covered github will not let you merge it.
>> 
>> See for example this change: 
>> https://github.com/twisted/twisted/pull/261/files#diff-0fea8a8ca713deb7ea6a10053273319aR2360
>>  
>> <https://github.com/twisted/twisted/pull/261/files#diff-0fea8a8ca713deb7ea6a10053273319aR2360>
>> 
>> The errback is there to help with test failures ... but the test should 
>> never fail, so that errback is never called... and that line is not covered.
>> 
>> 
>> It doesn't always make sense to require 100% execution of all test code.  
>> It's not at all uncommon to only have code in a test suite that runs when a 
>> test fails.  Historically, Twisted has never had a requirement of 100% 
>> execution of test code.  The only test suite coverage requirements that have 
>> commonly been requested or enforced is for coverage of implementation code.
>> 
>> I'd suggest removing the coverage enforcement for test suite code.
> 
> I am inclined to disagree, albeit mildly.
> 
> When one is writing a deliberately un-covered path in test code, presumably, 
> one is writing either a test helper - a mock, fake, or utility for setting up 
> a real implementation - or an assertion method.  Historically, I believe that 
> when we've invested more heavily in making these utilities "real" themselves, 
> and not just throwaway stuff inline in a test method or module, the benefits 
> have far outweighed the costs.  In fact the availability of proto_helpers is 
> one of the selling points of Twisted as opposed to other competing engines.
> 
> I mostly agree with this.  However, I was thinking of a slightly different 
> pattern when I wrote my earlier email.  Here's are a couple (fictional) 
> examples of that pattern one might find in unit tests for application code 
> (and there's nothing Twisted-specific here):
> 
> if foo:
>     self.fail("Foo!")
> 
> try:
>     foo()
> except:
>     bar
> else:
>     self.fail("Foo :(")

Hm.  This pattern is exactly what I was thinking of though - as you point out, 
these examples did get generalized :-).

In principle, I agree that a one-off example like this does not benefit from 
extensive refactoring to facilitate general use.  But... in practice, every 
example of this that I've seen in a long-lived codebase eventually metastasizes 
into a repeated copy/paste pattern, or a big gross mixin that all tests 
practically need.  Forcing everyone to deal with the problem sooner rather than 
later seems to have been a win on the few projects where I've gotten to 
practice it.

> It's not exactly that this can't be code that's executed in a passing run of 
> the test suite.  It's more a question of what the right balance point is.  If 
> someone wants to generalize logic like this (and, fortunately, someone did 
> generalize these particular examples - they're assertFalse and assertRaises, 
> respectively) then that's great and the result is a higher level of 
> confidence resulting from a successful run of the test suite.  I'd suggest 
> that if tests like these exercise all of the implementation code (on a 
> successful run), though, then you've still achieved a pretty high level of 
> test coverage and maybe further efforts are more productively directed 
> elsewhere (increasing the coverage level of other implementation code in 
> Twisted, for example :).

Speaking only from my direct experience here, adding good test helpers is a net 
reduction in effort very quickly; they pay for themselves on only the third 
test you write with them :).  So I don't feel like this is much of a burden, 
but I'd be interested in hearing others' feedback here.

> If folks want a higher bar than this, I'm not going to argue (at least not 
> much, at least not now).  The bar hasn't been this high in the past though 
> (and there are many many such cases to be found in Twisted's test suite right 
> now and I don't have the impression this has ever been much of a source of 
> problems).

I wish it were easier to search my own reviews, because I think I've prodded 
people to factor this kind of stuff out, but I can't find any handy examples.

But, I can see that right after this, I'm going to have to answer Craig's 
email, so perhaps we'll get to see a specific example :).

> Therefore, I think that asking folks to add independent test coverage to 
> verify their fakes and ensure that the failure-reporting of their assertion 
> messages are helpful in the event a test fails is a generally good idea, and 
> we should keep the requirement for 100% coverage on both test and 
> implementation coverage.
> 
> However, if there is contention around this, I'd much rather get a ratchet in 
> place for implementation code that's reliable and everyone is happy with, so 
> I'm OK with disabling coverage reporting for our *.test.* packages as a step 
> towards that.
> 
> I completely agree that fakes should be verified.  So much so that I'm not 
> even sure I believe in fakes in general anymore.  Instead, you should just 
> have easy to use interfaces and ship inexpensive implementations alongside 
> whatever other implementations you also need.

💯

> And all those implementations should have great test coverage.  I also 
> completely agree that when tests fail, they should do so in a meaningful way. 
>  I suspect slightly the implication that automated test coverage for the 
> failure case demonstrates the failure is reported meaningfully, though. :)  I 
> think we're still stuck with relying on humans (authors, reviewers) to verify 
> that property.

Sure, rich and meaningful semantic error reporting is a human's job.  But 
"doesn't just raise an exception and lose all the information about what 
happened due to an attribute spelling error on the rare race-y test that fails 
1/10000 times" is a good first approximation, and tests are good at that sort 
of thing ;-).

-glyph
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to