Hi Lukas:
On 22 May 2011, at 13:32, Lukas Renggli wrote:
>> Is there any alternative available to HDTestReport to be able to run
>> headless tests, or actually run the SUnit tests in a non-morphic image?
>
> Not that I know of.
Ok, thanks.
The code below is a shameless ripoff of yours, stripped down to the basics, and
meant for people that need a quick hack runner/reporter for SUnit test cases in
a transcript or on any other stream for that matter.
So, in case anyone finds it useful, here you go:
'From Pharo1.3a of ''18 January 2011'' [Latest update: #13207] on 22 May 2011
at 4:35:01 pm'!
Object subclass: #TestConsoleRunner
instanceVariableNames: 'suite suitePosition suiteTime suiteFailures
suiteErrors stream'
classVariableNames: ''
poolDictionaries: ''
category: 'SUnit-UI'!
!TestConsoleRunner methodsFor: 'initialization' stamp: 'StefanMarr 5/22/2011
15:58'!
initialize
stream := self class defaultOutputTarget! !
!TestConsoleRunner methodsFor: 'initialization' stamp: 'StefanMarr 5/22/2011
15:53'!
initializeOn: aTestSuite
suite := aTestSuite.
suitePosition := suiteTime := suiteFailures := suiteErrors := 0! !
!TestConsoleRunner methodsFor: 'running' stamp: 'StefanMarr 5/22/2011 15:54'!
run
Author uniqueInstance
ifUnknownAuthorUse: 'TestConsoleRunner'
during: [ [
self setUp.
suiteTime := [ self runAll ]
timeToRun ]
ensure: [ self tearDown ] ]! !
!TestConsoleRunner methodsFor: 'running' stamp: 'StefanMarr 5/22/2011 16:03'!
runAll
suite tests do: [ :each | each run: self ]! !
!TestConsoleRunner methodsFor: 'running' stamp: 'StefanMarr 5/22/2011 16:03'!
runCase: aTestCase
| error time stack |
time := [ [ aTestCase runCase ]
on: Halt , Error, TestFailure
do: [ :err |
error := err.
stack := self stackTraceString: err of: aTestCase ] ]
timeToRun.
self beginTestCase: aTestCase time: time.
(error isNil or: [ aTestCase expectedFailures includes: aTestCase
selector ]) ifFalse: [
(error isKindOf: TestFailure)
ifTrue: [ self writeError: error stack: stack ]
ifFalse: [ self writeError: error stack: stack ] ].
self endTestCase! !
!TestConsoleRunner methodsFor: 'running' stamp: 'StefanMarr 5/22/2011 16:03'!
setUp
stream nextPutAll: 'TestSuite '; nextPutAll: suite name; nextPutAll:
':'; nextPut: Character lf.
stream nextPutAll: 'Tests: '; print: suite tests size; nextPut:
Character lf.
"Initialize the test resources."
suite resources do: [ :each |
each isAvailable
ifFalse: [ each signalInitializationError ] ]! !
!TestConsoleRunner methodsFor: 'running' stamp: 'StefanMarr 5/22/2011 16:18'!
tearDown
suite resources
do: [ :each | each reset ].
stream nextPutAll: 'failures='; print: suiteFailures;
tab;
nextPutAll:'errors='; print: suiteErrors;
tab;
nextPutAll: 'time='; print: suiteTime / 1000.0;
nextPut: Character lf.
! !
!TestConsoleRunner methodsFor: 'private' stamp: 'StefanMarr 5/22/2011 16:16'!
beginTestCase: aTestCase time: time
stream tab;
nextPutAll: (aTestCase class category); nextPut: $.;
nextPutAll: (aTestCase class name); nextPut: $.;
nextPutAll: (aTestCase selector);
tab;
nextPutAll: 'time='; print: time / 1000.0;
nextPut: Character lf! !
!TestConsoleRunner methodsFor: 'private' stamp: 'StefanMarr 5/22/2011 16:16'!
endTestCase
stream tab;
nextPut: Character lf! !
!TestConsoleRunner methodsFor: 'private' stamp: 'StefanMarr 5/22/2011 16:28'!
stackTraceString: err of: aTestCase
^ String streamContents: [ :str |
| context |
context := err signalerContext.
[ context isNil or: [ context receiver == aTestCase and: [
context methodSelector == #runCase ] ] ] whileFalse: [
str print: context; nextPut: Character lf.
context := context sender ] ] ! !
!TestConsoleRunner methodsFor: 'private' stamp: 'StefanMarr 5/22/2011 16:30'!
writeError: error stack: stack
suiteErrors := suiteErrors + 1.
stream tab; tab;
nextPutAll: 'Error type='; nextPutAll: (error class name);
tab;
nextPutAll: ' message='; nextPutAll: (error messageText ifNil: [ error
description ]);
nextPut: Character lf;
nextPutAll: stack;
nextPut: Character lf;
nextPut: Character lf! !
!TestConsoleRunner methodsFor: 'private' stamp: 'StefanMarr 5/22/2011 16:31'!
writeFailure: error stack: stack
suiteFailures := suiteFailures + 1.
stream tab; tab;
nextPutAll: 'Failure type='; nextPutAll: (error class name);
tab;
nextPutAll: 'message='; nextPutAll: (error messageText ifNil: [ error
description ]);
nextPut: Character lf;
nextPutAll: stack;
nextPut: Character lf;
nextPut: Character lf! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
TestConsoleRunner class
instanceVariableNames: ''!
!TestConsoleRunner class methodsFor: 'running' stamp: 'StefanMarr 5/22/2011
15:50'!
runCategories: aCollectionOfStrings
^ aCollectionOfStrings do: [ :each | self runCategory: each ]! !
!TestConsoleRunner class methodsFor: 'running' stamp: 'StefanMarr 5/22/2011
15:50'!
runCategory: aString
^ self runClasses: (Smalltalk organization classesInCategory: aString)
named: aString! !
!TestConsoleRunner class methodsFor: 'running' stamp: 'StefanMarr 5/22/2011
15:52'!
runClasses: aCollectionOfClasses named: aString
| suite classes |
suite := TestSuite named: aString.
classes := (aCollectionOfClasses
select: [ :each | (each includesBehavior: TestCase) and: [ each
isAbstract not ] ])
asSortedCollection: [ :a :b | a name <= b name ].
classes isEmpty
ifTrue: [ ^ self ].
classes
do: [ :each | each addToSuiteFromSelectors: suite ].
^ self runSuite: suite! !
!TestConsoleRunner class methodsFor: 'running' stamp: 'StefanMarr 5/22/2011
15:52'!
runPackage: aString
^ self runClasses: (PackageInfo named: aString) classes named: aString!
!
!TestConsoleRunner class methodsFor: 'running' stamp: 'StefanMarr 5/22/2011
15:50'!
runPackages: aCollectionOfStrings
^ aCollectionOfStrings do: [ :each | self runPackage: each ]! !
!TestConsoleRunner class methodsFor: 'running' stamp: 'StefanMarr 5/22/2011
15:52'!
runSuite: aTestSuite
^ self new
initializeOn: aTestSuite;
run! !
!TestConsoleRunner class methodsFor: 'defaults' stamp: 'StefanMarr 5/22/2011
15:57'!
defaultOutputTarget
^ Transcript! !
Best regards
Stefan
--
Stefan Marr
Software Languages Lab
Vrije Universiteit Brussel
Pleinlaan 2 / B-1050 Brussels / Belgium
http://soft.vub.ac.be/~smarr
Phone: +32 2 629 2974
Fax: +32 2 629 3525