Search code examples
testinggocommand-line-argumentsgo-flag

Process command line arguments in go test


Is there a way to get the command line arguments in go "tests",
When you call go test obviously your main is not run, so is there a way to process command line arguments,

One way would be to use the flags packages and check for the command line arguments in each test or function being tested, but that is not ideal for that you need to do this in lots and lots of places, unlike the way you to it just in main when you run the application.

One may think it is a wrong thing to do, and that it is against purity of unit-tests:

  1. not all tests are unit tests
  2. it is very functional not to rely on "ENV" variables and actually pass the stuff as arguments in command line,

For the record I ended up putting an init() function in one of my _test files, and set the variable that is set through flags when the main is called this way.


Solution

  • Environmental configs are best kept in environment variables, in my experience. You can rely on global variables like so:

    var envSetting = os.Getenv("TEST_ENV")
    

    Alternatively, if using flags is a requirement, you could place your initialization code inside a function called init().

    func init() {
        flags.Parse()
        myEnv = *envFlag
        // ...
    }