[squeak-dev] The Trunk: SUnit-ct.133.mcz

Jakob Reschke jakres+squeak at gmail.com
Thu Jan 13 22:32:38 UTC 2022


Good that it stops in a method without the test timeout, which always
gives me headaches with the Through button if I try to debug through
setUp and tearDown. :-)

The original reason for the halt might have been that SUnit works
across Smalltalk dialects. http://sunit.sourceforge.net/
The Squeak facility of jumping into a Process just at the right
context is not so portable, of course.

I like the changed experience, but here is one theoretical doubt: what
if a project has overrides for #runCase or #runCaseAsFailure: in good
faith, or what if they send #runCaseAsFailure: or #debug from a
specialized test runner (however that would look like with the user
interaction)? In #debug they will no longer get their #runCase
behavior and #runCaseAsFailure: is now deprecated.

Am Mo., 10. Jan. 2022 um 19:03 Uhr schrieb <commits at source.squeak.org>:
>
> Christoph Thiede uploaded a new version of SUnit to project The Trunk:
> http://source.squeak.org/trunk/SUnit-ct.133.mcz
>
> ==================== Summary ====================
>
> Name: SUnit-ct.133
> Author: ct
> Time: 29 December 2021, 6:38:28.060638 pm
> UUID: 83af50fb-86e6-d843-8e9e-9abe8e8e379a
> Ancestors: SUnit-mt.125
>
> Updates debugging logic of TestCase. Instead of abusing #halt, open a debugger directly on the entrypoint to run the case. Deprecates #openDebuggerOnFailingTestMethod.
>
> Also slightly refactors internal behavior to avoid some duplication, and to get rid of unnecessary semaphores which do not add any value compared to #ensure: unless some really low-level things are broken.
>
> Supersedes SUnit-ct.125. Based on my own experiences from >1.5 years, I have revised #debugAsFailure to always halt right before sending #setUp. This improves a) the explorability of any custom set-up/tear-down logic of the test case and b) the immediacy of opening a debugger if you have a very heavy #setUp implementation. From the user perspective, effectively, you still have to click "Over-into-over-into" to navigate into the actual test method.
>
> Please report back whether you find this behavior acceptable. :-)
>
> =============== Diff against SUnit-mt.125 ===============
>
> Item was added:
> + ----- Method: TestCase>>assureResourcesDuring: (in category 'private') -----
> + assureResourcesDuring: aBlock
> +
> +       | resources |
> +       resources := self resources.
> +       resources do: [:resource |
> +               resource isAvailable ifFalse: [
> +                       ^ resource signalInitializationError]].
> +       ^ aBlock ensure: [
> +               resources do: [:resource |
> +                       resource reset]].!
>
> Item was changed:
>   ----- Method: TestCase>>debug (in category 'running') -----
>   debug
> +       "Run the receiver and open a debugger on the first failure or error."
> +
> +       ^ self assureResourcesDuring: [self runCaseWithoutTimeout]!
> -       self resources do:
> -               [ : res | res isAvailable ifFalse: [ ^ res signalInitializationError ] ].
> -       [ self runCase ] ensure:
> -               [ self resources do:
> -                       [ : each | each reset ] ]!
>
> Item was changed:
>   ----- Method: TestCase>>debugAsFailure (in category 'running') -----
>   debugAsFailure
> +       "Spawn a debugger that is ready to debug the receiver."
> +
> +       (Process
> +               forBlock: [self debug]
> +               runUntil: [:context | context isClosureContext "navigate the process directly to the point where it is about to send #setUp"
> +                       and: [context selector = #runCaseWithoutTimeout]])
> +                               debug.!
> -       | semaphore |
> -       semaphore := Semaphore new.
> -       self resources do: [:res |
> -               res isAvailable ifFalse: [^res signalInitializationError]].
> -       [semaphore wait. self resources do: [:each | each reset]] fork.
> -       (self class selector: testSelector) runCaseAsFailure: semaphore.!
>
> Item was changed:
>   ----- Method: TestCase>>openDebuggerOnFailingTestMethod (in category 'running') -----
>   openDebuggerOnFailingTestMethod
> +
> +       self deprecated: 'ct: Use #debugAsFailure'.
> +
>         "SUnit has halted one step in front of the failing test method. Step over the 'self halt' and
>          send into 'self perform: testSelector' to see the failure from the beginning"
> -
>         self
>                 halt;
>                 performTest!
>
> Item was changed:
>   ----- Method: TestCase>>runCaseAsFailure: (in category 'running') -----
>   runCaseAsFailure: aSemaphore
> +
> +       self deprecated: 'ct: Use #runCaseWithoutTimeout and #ensure:'.
> +       ^ [self runCaseWithoutTimeout]
> +               ensure: [aSemaphore signal]!
> -       [self setUp.
> -       self openDebuggerOnFailingTestMethod] ensure: [
> -               self tearDown.
> -               aSemaphore signal]!
>
> Item was added:
> + ----- Method: TestCase>>runCaseWithoutTimeout (in category 'running') -----
> + runCaseWithoutTimeout
> +
> +       [self setUp.
> +       self performTest]
> +               ensure: [self tearDown].!
>
>


More information about the Squeak-dev mailing list