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