Testing user interactions: the Spotter case study

Testing user interactions can be difficult, especially when the user interface relies on background processes.

An interesting case is Spotter. The interface resides in a dropdown and it relies on significant background processes: first for performing searches, and second for showing the selection preview.

To exemplify and test the interface, we use Scripter. Here is a scenario that is reasonably complicated:

— we start a Spotter, and the first item is selected — we hover over the first item in the second category — then we hover over the item Ok action — and then we click on the button

spotterElementOnStartSampleActOnSecondCandidateWithDefaultObjectActOn
	<gtExample>
	<return: #BlScripter>
	| scripter actOnEvents actOn actOnHandler |
	scripter := self spotterElementOnStartSample.

	actOnEvents := OrderedCollection new.
	actOnHandler := GtSpotterByScripterExamplesActOnHandler new
			actOnEvents: actOnEvents.

	scripter element spotter announcer weak
		when: GtSpotterObjectActOn
		send: #onActed:
		to: actOnHandler.

	scripter mouseMoveOverStep: [ :s | s id: GtSpotterCandidateElementId index: 2 ].

	scripter
		mouseMoveOverStep: [ :s | 
			s
				id: GtSpotterCandidateElementId index: 2;
				id: GtSpotterCandidateActOnButtonId ].

	scripter
		clickStep: [ :s | 
			s
				id: GtSpotterCandidateElementId index: 2;
				id: GtSpotterCandidateActOnButtonId ].

	self assert: actOnEvents size equals: 1.

	actOn := actOnEvents first.

	self assert: actOn isActedUpon equals: true.
	self assert: actOn spotterSearch title equals: 'Priority 20'.
	self assert: actOn spotterStep equals: scripter element spotter steps first.
	self assert: actOn rawObject equals: 20.
	self assert: actOn objectToSend equals: 20.
	self assert: actOn toolToSend class equals: GtInspectorTool.
	self assert: actOn toolToSend object equals: 20.

	^ scripter
    

Scripter not only allows us to express all this logic and to deal with the background behavior transparently, but it also provides a preview of the actions.

This allows us to go back and forth between the script and the preview to guide the actual testing scenario.