Skip to content

proposal: testing: allow TestMain to return int #23404

Closed

Description

@rogpeppe

Currently TestMain is expected to call os.Exit itself, but that means it's
not possible to use defer to do package-wide test cleanup there,
because the defer will never be called.

I propose that TestMain be optionally allowed to return an integer,
in which case os.Exit will be called with its result.

Then we can write:

 func TestMain(m *testing.M) int {
     defer testhelper.Cleanup()
     return m.Run()
 }

which is arguably more natural and harder to get wrong than calling os.Exit.

Activity

  1. added this to the Proposal milestone on Jan 10, 2018
  2. mvdan commented on Jan 10, 2018

    @mvdan
    Member

    Playing the devil's advocate - if one wants to be sure that os.Exit can't interfere with defers, what about something like:

    func TestMain(m *testing.M) { os.Exit(testMain(m)) }
    
    func testMain(m *testing.M) int {
         defer testhelper.Cleanup()
         return m.Run()
    }
    

    I understand that this is more verbose, but I'm wondering if that offsets adding extra code and documentation to the testing package. I would definitely agree with you if the testing package was designed from the ground up, however. Unless there is a specific reason for os.Exit that we are both missing.

  3. OneOfOne commented on Jan 10, 2018

    @OneOfOne
    Contributor

    @mvdan os.Exit is required to indicate tests success or failure iirc.

  4. mvdan commented on Jan 10, 2018

    @mvdan
    Member

    @OneOfOne what is your point? The integer that you can use in an os.Exit call is the same integer that @rogpeppe suggests to have as a return parameter. See my silly workaround above as an example.

  5. rsc commented on Jan 29, 2018

    @rsc
    Contributor

    TestMain is already a rare need. It doesn't make much sense to stack another one on top, especially when you can do what @mvdan suggests.

  6. locked and limited conversation to collaborators on Jan 29, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions