@@ -198,36 +198,38 @@ def build_xml_doc(self, encoding=None):
198198
199199 # failures
200200 for failure in case .failures :
201- attrs = {"type" : "failure" }
202- if failure ['message' ]:
203- attrs ['message' ] = decode (failure ['message' ], encoding )
204- if failure ['type' ]:
205- attrs ['type' ] = decode (failure ['type' ], encoding )
206- failure_element = ET .Element ("failure" , attrs )
207- if failure ['output' ]:
208- failure_element .text = decode (failure ['output' ], encoding )
209- test_case_element .append (failure_element )
201+ if failure ["output" ] or failure ["message" ]:
202+ attrs = {"type" : "failure" }
203+ if failure ["message" ]:
204+ attrs ["message" ] = decode (failure ["message" ], encoding )
205+ if failure ["type" ]:
206+ attrs ["type" ] = decode (failure ["type" ], encoding )
207+ failure_element = ET .Element ("failure" , attrs )
208+ if failure ["output" ]:
209+ failure_element .text = decode (failure ["output" ], encoding )
210+ test_case_element .append (failure_element )
210211
211212 # errors
212213 for error in case .errors :
213- attrs = {"type" : "error" }
214- if error ['message' ]:
215- attrs ['message' ] = decode (error ['message' ], encoding )
216- if error ['type' ]:
217- attrs ['type' ] = decode (error ['type' ], encoding )
218- error_element = ET .Element ("error" , attrs )
219- if error ['output' ]:
220- error_element .text = decode (error ['output' ], encoding )
221- test_case_element .append (error_element )
214+ if error ["message" ] or error ["output" ]:
215+ attrs = {"type" : "error" }
216+ if error ["message" ]:
217+ attrs ["message" ] = decode (error ["message" ], encoding )
218+ if error ["type" ]:
219+ attrs ["type" ] = decode (error ["type" ], encoding )
220+ error_element = ET .Element ("error" , attrs )
221+ if error ["output" ]:
222+ error_element .text = decode (error ["output" ], encoding )
223+ test_case_element .append (error_element )
222224
223225 # skippeds
224226 for skipped in case .skipped :
225227 attrs = {"type" : "skipped" }
226- if skipped [' message' ]:
227- attrs [' message' ] = decode (skipped [' message' ], encoding )
228+ if skipped [" message" ]:
229+ attrs [" message" ] = decode (skipped [" message" ], encoding )
228230 skipped_element = ET .Element ("skipped" , attrs )
229- if skipped [' output' ]:
230- skipped_element .text = decode (skipped [' output' ], encoding )
231+ if skipped [" output" ]:
232+ skipped_element .text = decode (skipped [" output" ], encoding )
231233 test_case_element .append (skipped_element )
232234
233235 # test stdout
@@ -377,6 +379,7 @@ def __init__(
377379 line = None ,
378380 log = None ,
379381 url = None ,
382+ allow_multiple_subelements = False ,
380383 ):
381384 self .name = name
382385 self .assertions = assertions
@@ -396,41 +399,70 @@ def __init__(
396399 self .errors = []
397400 self .failures = []
398401 self .skipped = []
402+ self .allow_multiple_subalements = allow_multiple_subelements
399403
400404 def add_error_info (self , message = None , output = None , error_type = None ):
401405 """Adds an error message, output, or both to the test case"""
402- if message or output or error_type :
403- error = {}
404- error ['message' ] = message
405- error ['output' ] = output
406- error ['type' ] = error_type
406+ error = {}
407+ error ["message" ] = message
408+ error ["output" ] = output
409+ error ["type" ] = error_type
410+ if self .allow_multiple_subalements :
411+ if message or output :
412+ self .errors .append (error )
413+ elif not len (self .errors ):
407414 self .errors .append (error )
415+ else :
416+ if message :
417+ self .errors [0 ]["message" ] = message
418+ if output :
419+ self .errors [0 ]["output" ] = output
420+ if error_type :
421+ self .errors [0 ]["type" ] = error_type
408422
409423 def add_failure_info (self , message = None , output = None , failure_type = None ):
410424 """Adds a failure message, output, or both to the test case"""
411- if message or output or failure_type :
412- failure = {}
413- failure ['message' ] = message
414- failure ['output' ] = output
415- failure ['type' ] = failure_type
425+ failure = {}
426+ failure ["message" ] = message
427+ failure ["output" ] = output
428+ failure ["type" ] = failure_type
429+ if self .allow_multiple_subalements :
430+ if message or output :
431+ self .failures .append (failure )
432+ elif not len (self .failures ):
416433 self .failures .append (failure )
434+ else :
435+ if message :
436+ self .failures [0 ]["message" ] = message
437+ if output :
438+ self .failures [0 ]["output" ] = output
439+ if failure_type :
440+ self .failures [0 ]["type" ] = failure_type
417441
418442 def add_skipped_info (self , message = None , output = None ):
419443 """Adds a skipped message, output, or both to the test case"""
420- if message or output :
421- skipped = {}
422- skipped ['message' ] = message
423- skipped ['output' ] = output
444+ skipped = {}
445+ skipped ["message" ] = message
446+ skipped ["output" ] = output
447+ if self .allow_multiple_subalements :
448+ if message or output :
449+ self .skipped .append (skipped )
450+ elif not len (self .skipped ):
424451 self .skipped .append (skipped )
452+ else :
453+ if message :
454+ self .skipped [0 ]["message" ] = message
455+ if output :
456+ self .skipped [0 ]["output" ] = output
425457
426458 def is_failure (self ):
427459 """returns true if this test case is a failure"""
428- return ( len ( self .failures ) > 0 )
460+ return sum ( 1 for f in self .failures if f [ "message" ] or f [ "output" ] ) > 0
429461
430462 def is_error (self ):
431463 """returns true if this test case is an error"""
432- return ( len ( self .errors ) > 0 )
464+ return sum ( 1 for e in self .errors if e [ "message" ] or e [ "output" ] ) > 0
433465
434466 def is_skipped (self ):
435467 """returns true if this test case has been skipped"""
436- return ( len (self .skipped ) > 0 )
468+ return len (self .skipped ) > 0
0 commit comments