[Piglit] [PATCH] framework/backends/junit: Report expected failures/crashes as skipped.

Mark Janes mark.a.janes at intel.com
Tue Mar 3 14:26:00 PST 2015

Jose Fonseca <jfonseca at vmware.com> writes:

> Thanks for the reviews.
> My setup is not complicated as yours.  Mostly because my main focus has 
> been llvmpipe, and we're not actively adding supporting to new OpenGL 
> extensions for it at this moment, so most of the new piglit tests either 
> skip or pass. New failures are relatively rare.

One of the lessons I learned with Jenkins is that if the automation is
complex, it should be in git and not in Jenkins projects.  Our Jenkins
jobs typically just execute a single script with a constrained set of

This facilitates testing/debugging without invoking builds on the
Jenkins instance.  It also is much easier to handle development branches
by branching your scripts, as opposed to cloning Jenkins projects.

We orchestrate multi-platform jobs with python via Jenkins Remote Access
API.  Binaries and test results are communicated between builds via a
shared drive.

> Before I used 
> https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin -- it 
> allows to control if/when emails are sent with great flexibility. In 
> particular it allows to send emails for new regressions, but not for 
> tests that were failing previously.
> Still, nothing beats being able to look at a bunch of test jobs and 
> immediately tell all blue == all good.   Alhough I use jenkins for many 
> years now, this is a lesson I only learned recently -- it's better to 
> mask out expected failures somehow and get a boolean "all pass" or 
> "fail" for the whole test stuie, than trying to track pass/fail for 
> individual tests.  The latter just doesn't scale...
> We do have an internal branches where we run piglit.  I confess I don't 
> a good solution yet.  Your trick of maintaining a database of which git 
> commit tests were added is quite neat.  Another thing worth considering 
> would be to branch or tag/ piglit whenever Mesa is branched, and keep 
> using a matching (and unchanging) piglit commit.

Tagging piglit is a simpler solution than what I've done.  The primary
use case, though, is for developers to test their branches before they
send them to the mailing list.  Without a recent rebase, their branches
will typically report failures on tests which were fixed on master.

> We also run testsuites through different APIs (namely D3D9/10).  These 
> testsuite rarely get updated, and llvmpipe conformance is actually quite 
> good to start with, so it's easy to get "all pass" there.
> Piglit, by being continuously updated/extended, is indeed more of a 
> challenge than other testsuites.
> We also use piglit for testing our OpenGL guest driver, but we use an 
> internal testing infrastructure to driver, not Jenkins.  So our 
> experiences there don't apply.
> I also have a few benchmarks on jenkins.  Again, I only keep track of 
> performance metrics via Jenkins Plots and Measurements plugins, but I 
> don't produce pass/fail based on those metrics.  I am however 
> considering doing something of the sort -- e.g., getting the history of 
> the metrics via jenkins JSON API, fit into a probablylity distribution, 
> and fail when performance goes below a given percentile.

I'm curious to know which benchmarks you use.  We experience variability
in a lot of benchmarks, especially if they are cpu-heavy and running on
an under-powered system.  It would be great to have workloads that
produce reliable trends without having to run them repeatedly.

thanks for the details!


> Jose
> On 03/03/15 18:34, Mark Janes wrote:
>> Thanks Jose! this is an improvement.
>> In my experience, broken tests are introduced and fixed in mesa on a
>> daily basis.  This has a few consequences:
>>   - On a daily basis, I look at failures and update the expected
>>     pass/fails depending on whether it is a new test or a regression.
>>     Much of this process is automated.
>>   - Branches quickly diverge on the basis of passing/failing tests.
>>     Having separate pass/fail configs on release branches is
>>     unmanageable.  To account for this, my automation records the
>>     relevant commit sha as the value in the config file (the key is the
>>     test name).  I post-process the junit xml to filter out test failures
>>     with commits that occurred after the branch point.
>>   - for platforms that are too slow to build each checkin, I run an
>>     automated bisect which builds/tests in jenkins, then updates config
>>     files.
>>   - Our platform matrix generates over 350k unskipped tests for each
>>     build.  We filter out skipped tests due to the memory consumption on
>>     jenkins when displaying this many tests.
>> I am interested in learning more about your test system, and sharing
>> lessons learned / techniques.
>> -Mark
>> Reviewed-by: Mark Janes <mark.a.janes at intel.com>
>> Jose Fonseca <jfonseca at vmware.com> writes:
>>> I recently tried the junit backend's ability to ignore expected
>>> failures/crashes and found it a godsend -- instead of having to look as
>>> test graph results periodically, I can just tell jenkins to email me
>>> when things go south.
>>> The only drawback is that by reporting the expected issues as passing it
>>> makes it too easy to forget about them and misinterpret the pass-rates.
>>> So this change modifies the junit backend to report the expected issues
>>> as skipped, making it more obvious when looking at the test graphs that
>>> these tests are not really passing, and that whatever functionality they
>>> target is not being fully covered.
>>> This change also makes use of the junit `message` attribute to explain
>>> the reason of the skip.  (In fact, we could consider using the `message`
>>> attribute on other kind of failures to inform the piglit result, instead
>>> of using the non-standard `type`.)
>>> ---
>>>   framework/backends/junit.py | 4 +++-
>>>   1 file changed, 3 insertions(+), 1 deletion(-)
>>> diff --git a/framework/backends/junit.py b/framework/backends/junit.py
>>> index 82f9c29..53b6086 100644
>>> --- a/framework/backends/junit.py
>>> +++ b/framework/backends/junit.py
>>> @@ -129,17 +129,19 @@ class JUnitBackend(FileBackend):
>>>               # Add relevant result value, if the result is pass then it doesn't
>>>               # need one of these statuses
>>>               if data['result'] == 'skip':
>>> -                etree.SubElement(element, 'skipped')
>>> +                res = etree.SubElement(element, 'skipped')
>>>               elif data['result'] in ['warn', 'fail', 'dmesg-warn', 'dmesg-fail']:
>>>                   if expected_result == "failure":
>>>                       err.text += "\n\nWARN: passing test as an expected failure"
>>> +                    res = etree.SubElement(element, 'skipped', message='expected failure')
>>>                   else:
>>>                       res = etree.SubElement(element, 'failure')
>>>               elif data['result'] == 'crash':
>>>                   if expected_result == "error":
>>>                       err.text += "\n\nWARN: passing test as an expected crash"
>>> +                    res = etree.SubElement(element, 'skipped', message='expected crash')
>>>                   else:
>>>                       res = etree.SubElement(element, 'error')
>>> --
>>> 2.1.0

More information about the Piglit mailing list