"{ Package: 'stx:goodies/sunit' }"
Object subclass:#TestResultReporter
instanceVariableNames:'result stream'
classVariableNames:''
poolDictionaries:''
category:'SUnit-Report'
!
!TestResultReporter class methodsFor:'reporting'!
report: aTestResult format: format as: stringOrFilename
self new report: aTestResult format: format as: stringOrFilename
!
report: aTestResult format: format on: stream
self new report: aTestResult format: format on: stream
! !
!TestResultReporter methodsFor:'reporting'!
report:format
|reportFormatSelector|
reportFormatSelector := self reportFormatSelector:format.
(self respondsTo: reportFormatSelector)
ifTrue:[self perform: reportFormatSelector]
ifFalse:[self error:'Unsupported format: ', format].
!
report: aTestResult format: format as: stringOrFilename
| s |
s := stringOrFilename asFilename writeStream.
[ self report: aTestResult format: format on: s]
ensure:[s close].
!
report: aTestResult format: aSymbol on: aStream
result := aTestResult.
stream := aStream.
self report: aSymbol
!
reportFormatSelector:format
^ ('report' , format asString capitalized) asSymbol
! !
!TestResultReporter methodsFor:'reporting - xml'!
reportXml
"JUnit like XML unittest report format"
stream
nextPutLine: '<?xml version="1.0"?>';
nextPutLine: '<unittest-results>'.
result passed do:[:each|self reportXmlTest: each result: #success].
result failures do:[:each|self reportXmlTest: each result: #failure].
result errors do:[:each|self reportXmlTest: each result: #error].
stream
nextPutLine: '</unittest-results>'
!
reportXmlTest: test result: testResult
"
Example:
<test
duration='0.0188629627228'
status='error'
fixture='bitten.tests.web_ui.SourceFileLinkFormatterTestCase'
name='test_format_link_not_in_repos_with_line'
file='/usr/src/trac-bitten-0.6b2.dfsg/bitten/tests/web_ui.py'>
"
| testClassName |
testClassName := self sunitNameOf: test class.
stream
nextPutLine:'<test duration="0.0"'; "As we don't know the duration :-("
tab; nextPutAll:'status="'; nextPutAll: testResult; nextPutLine:'"';
tab; nextPutAll:'ficture="'; nextPutAll: testClassName; nextPutLine:'"';
tab; nextPutAll:'name="'; nextPutAll: test selector; nextPutLine:'"';
"I seems that some tools requires the file attributes. So we supply one :-)"
tab; nextPutAll:'file="'; nextPutAll: testClassName , '.st'; nextPutLine:'">'.
testResult ~= #success ifTrue:[self reportXmlTraceback: test].
stream nextPutLine:'</test>'.
!
reportXmlTraceback: test
"
Prints a traceback to the stream.
This is dialect-specific, so we have to check...
"
"Smalltalk/X dialect detection..."
((Smalltalk respondsTo: #isSmalltalkX) and:[Smalltalk isSmalltalkX])
ifTrue:[^self reportXmlTracebackStX: test]
!
reportXmlTracebackStX: test
stream nextPutLine:'<traceback><!![CDATA['.
[ test debug ]
on: GenericException
do: [:ex|
ex suspendedContext fullPrintAllOn: stream].
stream nextPutLine:']]></traceback>'.
"Modified: / 07-12-2009 / 14:06:48 / Jan Vrany <jan.vrant@fit.cvut.cz>"
! !
!TestResultReporter methodsFor:'utilities'!
sunitNameOf: aClass
"No all SUnit versions comes with sunitName
(at least Smalltalk/X 3.1)"
^(aClass respondsTo:#sunitName)
ifTrue:[aClass sunitName]
ifFalse:[aClass printString]
! !
!TestResultReporter class methodsFor:'documentation'!
version
^ '$Id: TestResultReporter.st,v 1.1 2011-06-29 19:15:49 cg Exp $'
!
version_SVN
^ '§Id§'
! !