【问题标题】:Run http.ListenAndServe() On Tests using stretchr/testify suite Stop Test From Proceed运行 http.ListenAndServe() On Tests using stretchr/testify suite Stop Test From Proceed
【发布时间】:2022-03-06 05:52:25
【问题描述】:

我正在尝试为我使用 gorilla/muxgorm.iogolang-migrate/v4 制作的 REST API 应用程序创建集成测试

对于我正在使用的测试testify

我的integration_Test.go中的SetupSuite()是这样的:

func (s *ReceiptServiceTestSuite) SetupSuite() {
    s.Require().NoError(godotenv.Load("test.env"))
    s.Require().NoError(database.Connect())
    s.db = database.DB
    s.m = database.M

    router.HandleRequests()
}

而我的router.HandleRequests()是这样的:

func HandleRequests() {
    router := mux.NewRouter()
    router.Use(middleware)
    // lots of router.HandleFunc()
    
    http.ListenAndServe(":8080", router)
}

问题是:如果我从SetupSuite() 中删除router.HandleRequests(),我的所有数据库测试都会正常运行,但如果我尝试http.ListenAndServe(),则测试工作流程会停止并且没有任何反应。

我认为我应该将 goroutine 与 router.HandleRequests() 一起使用,以便它可以与测试并行运行,但我不知道该怎么做。

更多信息,这里是项目repository,我不知道它是否相关,但我正在使用docker-compose 运行两个postgres 实例,一个用于运行项目,另一个用于测试.

【问题讨论】:

  • test server 而不是 http.ListenAndServe 中运行根处理程序。

标签: go gorilla suite testify


【解决方案1】:

我想出了如何使用 go 例程来做到这一点。

我读到了这个example,它教了如何使用通道处理os.Signals,我是这样实现的:

首先,我在路由器上做了如下改动:

func HandleRequests() {
    router := mux.NewRouter()
    router.Use(middleware)
    // lots of router.HandleFunc()
    
    go http.ListenAndServe(":8080", router)

    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)

    <-quit

}

所以现在http.ListenAndServe() 正在一个新线程中运行。我相信默认行为会在程序执行结束时停止。

http.ListenAndServe() 之后,我创建了一个os.Signal 通道,它将侦听来自系统的传入信号(SIGINT 和SIGTERM),然后该函数将在&lt;-quit 处停止,它将等待一个信号继续。

然后我修复了我的 SetupSuite() 以在 goroutine 中运行 router.HandleRequests()

func (s *ReceiptServiceTestSuite) SetupSuite() {
    s.Require().NoError(godotenv.Load("test.env"))
    s.Require().NoError(database.Connect())
    s.db = database.DB
    s.m = database.M

    go router.HandleRequests()
}

在我的TearDownSuite(),我向当前进程发送一个 SIGTERM 信号,该信号将被我之前在router.HandleRequests() 创建的quit 频道监听,并且该函数将继续终止程序。

func (s *ReceiptServiceTestSuite) TearDownSuite() {
    // some database code 
    p, _ := os.FindProcess(os.Getpid())
    p.Signal(syscall.SIGINT)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2021-06-04
    • 2021-12-26
    • 2019-06-25
    相关资源
    最近更新 更多