Is there a more elegant way to handle determing fail status?
donarb
donarb at nwlink.com
Tue Jan 15 18:52:43 EST 2013
On Tuesday, January 15, 2013 3:24:44 PM UTC-8, J wrote:
> Ok, so I have a diagnostic tool, written by someone else. That tool
>
> runs a series of small tests defined by the user and can simplified
>
> summary output that can be one of the following:
>
>
>
> FAILED_CRITICAL
>
> FAILED_HIGH
>
> FAILED_MEDIUM
>
> FAILED_LOW
>
> PASSED
>
>
>
> I also have a wrapper script I wrote to run these tests, summarize the
>
> results of all tests aggregated and then fail based on a particular
>
> fail level.
>
>
>
> The idea is that if I run 3 tests with the diagnostic tool and it
>
> tells me the following:
>
>
>
> testA: PASSED
>
> testB: FAILED_MEDIUM
>
> testC: PASSED
>
>
>
> AND I told the wrapper to only fail on HIGH or above, the wrapper will
>
> tell me that I had a medium failure, but the wrapper will still exit
>
> with a 0 (success)
>
>
>
> if I get the same results as above, but tell the wrapper to fail on
>
> LOW, then it will tell me I had that medium failure, but the wrapper
>
> will exit with a 1 (failure).
>
>
>
> The problem is that my exit determination looks like this:
>
>
>
> if fail_priority == fail_levels['FAILED_CRITICAL']:
>
> if critical_fails:
>
> return 1
>
> if fail_priority == fail_levels['FAILED_HIGH']:
>
> if critical_fails or high_fails:
>
> return 1
>
> if fail_priority == fail_levels['FAILED_MEDIUM']:
>
> if critical_fails or high_fails or medium_fails:
>
> return 1
>
> if fail_priority == fail_levels['FAILED_LOW']:
>
> if critical_fails or high_fails or medium_fails or low_fails:
>
> return 1
>
>
>
> return 0
>
>
>
> So, to explain the above... the fail level can be set by the user when
>
> running the wrapper using -f (or it defaults to 'high')
>
> the wrapper assigns a number to each level using this:
>
>
>
> # Set correct fail level
>
> args.fail_level = 'FAILED_%s' % args.fail_level.upper()
>
>
>
> # Get our failure priority and create the priority values
>
> fail_levels = {'FAILED_CRITICAL':4,
>
> 'FAILED_HIGH':3,
>
> 'FAILED_MEDIUM':2,
>
> 'FAILED_LOW':1}
>
> fail_priority = fail_levels[args.fail_level]
>
>
>
> the variables critical_fails, high_fails, medium_fails, low_fails are
>
> all counters that are etiher None, or the number of tests that were
>
> failed.
>
>
>
> So using this output from the diagnostic tool:
>
>
>
> testA: PASSED
>
> testB: FAILED_HIGH
>
> testC: PASSED
>
> testD: FAILED_MEDIUM
>
> testE: PASSED
>
>
>
> critical_fails would be None
>
> high_fails would be 1
>
> medium_fails would be 1
>
> low_fails would be None.
>
>
>
> The exit code determination above works, but it just feels inelegant.
>
> It feels like there's a better way of implementing that, but I can't
>
> come up with one that still honors the fail level properly (e.g. other
>
> solutions will fail on medium, but won't fail properly on medium OR
>
> higher).
>
>
>
> I can provide the full script if necessary, if the above isn't enough
>
> to point me in a direction that has a better way of doing this...
>
>
>
> Thanks for looking,
>
>
>
> Jeff
My back of the envelope coding would do it this way. Use an array of fail_counters, with PASSED as the first element all the way up to FAILED_CRITICAL as the last element. Then use a simple loop starting from index fail_priority to the end of the list looking for errors. Like this:
# Array of fail counters
fail_counters = [
0, # PASSED
0, # LOW
0, # MEDIUM
0, # HIGH
0 # CRITICAL
]
... run tests, accumulate error counts in fail_counters
for i in range(fail_priority, len(fail_counters)):
if fail_counters[i]:
return 1
return 0
More information about the Python-list
mailing list