为不同包上的所有测试运行单个Golang httptest服务器

时间:2016-09-24 22:52:09

标签: testing go

我的项目文件夹是这样的。它是一个很大的API,我只为组织pourposes分开文件。

$ tree src / backend /

src/backend/
├── cats
│   ├── cat_test.go
│   ├── handler.go
│   ├── routes.go
│   └── tools.go
├── cmd
│   ├── populate.go
│   ├── root.go
│   └── runserver.go
├── iot
│   └── device
│      ├── all.go
│      ├── all_test.go
│      ├── router.go
│      ├── types.go
│      └── update.go
├── main.go
├── main_test.go
└── root_test.go

在main_test.go上,我启动了httptest服务器

func TestMain(m *testing.M) {
    setup()
    exitVal := m.Run()
    teardown()
    os.Exit(exitVal)
}

func setup() {
    flag.StringVar(&util.ServerFlag, "server", "s", "server to set request for")
    flag.Parse()
    viper.SetDefault("testing", true)
    util.BasicStart()
    iot.RunDependencies()
    cats.SyncS3()
    router := cmd.InitRootRouter()
    util.SetTestServer(httptest.NewServer(router))
}

func teardown() {
    log.Println("[TESTS] - Teardown completed")

}

root_test.go运行go test -v ./src/backend/...时,src/backend/cat_test.go上的所有测试都有效。但{{1}}的测试失败是因为拆卸方法在运行时已被调用。如何让服务器在关闭之前等待所有测试运行?

1 个答案:

答案 0 :(得分:3)

每个软件包的测试作为单独的二进制文件运行,因此无法在软件包之间共享设置和拆除状态。如果您需要跨包进行复杂的设置或拆卸,那么您可以在项目中创建一个测试包,用于定义测试支架并从每个测试setup和{{1}调用它}。