[TIP] live coverage info during running program

Joel B. Mohler joel at kiwistrawberry.us
Sat Jun 11 03:36:20 PDT 2016


After reading the replies to my mail and the bitbucket ticket, I had a 
few more ideas.   I now stop/save/start the Coverage object and the key 
is using the parallel support (aka data_suffix=True) for sake of getting 
cumulative results with a combine.  In terms of the gui, the pause to 
stop/start is unnoticeable!   I suppose it qualifies as a bit hacky, but 
so far it has given robust & reliable results.

Here are my two code snips to make this work:

     import coverage
     cov = coverage.Coverage(data_suffix=True)
     cov.start()
     sys.coverer = cov
     my_program()  # the stuff of interest
     cov.stop()
     cov.save()
     # should do a final combine & coverage generation here

On an 8 second timer through-out the duration of the GUI I run the 
following method.

     def update_coverage_html(self):
         import os
         import threading
         def background_htmlify():
             # HACKY?! combine & html generation
             os.system("coverage combine")
             os.system("coverage html")

         if hasattr(sys, 'coverer'):
             sys.coverer.stop()
             sys.coverer.save()
             sys.coverer.start()
             t = threading.Thread(target=background_htmlify)
             t.start()

Joel

On 06/09/2016 08:28 AM, Ned Batchelder wrote:
> This is a current limitation of these methods, as reported here: 
> https://bitbucket.org/ned/coveragepy/issues/448/save-and-html_report-prevent-further
>
> I haven't yet looked into what it would take to allow continued 
> collection after the save().
>
> --Ned.
>
> On 6/8/16 1:15 PM, Joel B. Mohler wrote:
>> Dear Python testers,
>>
>> I'm trying to get a nice feedback loop for coverage testing both a 
>> Python REST
>> server and the client side GUI program.  I thought I could get 
>> coverage to
>> produce an html report on some interval -- say every 5-10 seconds.  This
>> doesn't seem to be a documented use-case ... or is it?
>>
>> Following the documentation, I've inserted:
>>
>>     import coverage
>>     cov = coverage.Coverage()
>>     cov.start()
>>     sys.coverer = cov # stash this in a global place
>>     my_program()  # bunch of code
>>     cov.stop()
>>     cov.save()
>>     cov.html_report()
>>
>> Inside my_program (which is really a whole GUI event loop), I've 
>> kicked off a
>> little chunk periodically to update the html:
>>
>>     sys.coverer.save()
>>     sys.coverer.html_report()
>>     # attempt at hacking some result-caching by coverage
>>     sys.coverer._measured = True
>>
>> On the first time I come to my update-the-html code and I get an htmlcov
>> directory that looks correct.  On the second and subsequent times, it 
>> looks as
>> though it rewrites exactly the same html.
>>
>> Is this possible?  Is there other caching I need to defeat? There is 
>> file hash
>> checking code in the HtmlReport which I do not fully understand.
>>
>> I understand this might be slow.  I was hoping that I could get an 
>> up-to-date
>> CoverageData object quickly then go htmlify it in the background.  
>> That looks
>> difficult since the HtmlReport takes a Coverage object not a 
>> CoverageData.
>>
>> Thanks,
>> Joel
>>
>> _______________________________________________
>> testing-in-python mailing list
>> testing-in-python at lists.idyll.org
>> http://lists.idyll.org/listinfo/testing-in-python
>
>
> _______________________________________________
> testing-in-python mailing list
> testing-in-python at lists.idyll.org
> http://lists.idyll.org/listinfo/testing-in-python




More information about the testing-in-python mailing list