为了账号安全,请及时绑定邮箱和手机立即绑定

GO 单元测试结构化 REST API 项目

GO 单元测试结构化 REST API 项目

Go
侃侃无极 2021-12-27 15:44:08
我正在尝试为我已经创建的 REST API编写很好的单元测试。我有这个简单的结构:ROOT/    config/    handlers/    lib/    models/    router/    main.goconfig包含 JSON 中的配置和一个简单的config.go读取和解析 JSON 文件并填充Config结构的文件。handlers包含控制器(即 中描述的相应 METHOD+URL 的处理程序router/routes.go)。lib包含一些数据库、请求响应器和记录器逻辑。models包含要映射到 JSON 和 DB 的结构及其函数。最后router包含路由器和路由定义。现在我正在搜索和阅读很多关于在 GO 中单元测试 REST API 的内容,并找到了或多或少令人满意的关于如何设置测试服务器、定义路由和测试我的请求的文章。一切都很好。但仅当您想测试单个文件时!我现在的问题是如何为所有处理程序设置测试环境(服务器、路由、数据库连接)?随着办法找到这里(我觉得这很容易理解和执行),我有一个问题:要么我必须为每个处理器单独运行测试或我必须写所有的处理程序测试套件在短短的一个测试文件。我相信你明白这两种情况都不是很愉快(第一是因为我需要保留go test运行所有成功的测试,第二是因为拥有一个测试文件来覆盖所有处理程序函数将变得无法维护)。到目前为止,只有当我将所有测试和初始化代码放入每个文件的一个 func 中时,我才成功(根据链接的文章),XYZhandler_test.go但我也不喜欢这种方法。我想要实现的是一种setUp()或init()运行一次,第一次触发的测试使所有必需的变量全局可见并初始化,以便所有下一个测试都可以使用它们,而无需再次实例化它们,同时确保编译此安装文件只为测试...我不确定这是否完全清楚,或者此类问题是否需要一些代码示例(除了文章中已经链接的内容,但我会添加您认为需要的任何内容,请告诉我!
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

测试包,而不是文件!


由于您正在测试处理程序/端点,因此将所有_test文件放在处理程序或路由器包中是有意义的。(例如,每个端点/处理程序一个文件)。


另外,不要init()用于设置您的测试。该testing包指定了一个具有以下签名的函数:


func TestMain(m *testing.M) 

生成的测试将调用 TestMain(m) 而不是直接运行测试。TestMain 运行在主 goroutine 中,并且可以围绕对 m.Run 的调用进行任何必要的设置和拆卸。然后它应该使用 m.Run 的结果调用 os.Exit


在 TestMain 函数中,您可以进行任何您需要的设置以运行您的测试。如果你有全局变量,这里就是声明和初始化它们的地方。您只需为每个包执行一次此操作,因此将TestMain代码放在单独的_test文件中是有意义的。例如:


package router


import (

    "testing"

    "net/http/httptest"


var (

    testServer *httptest.Server

)


func TestMain(m *testing.M)  {

    // setup the test server

    router := ConfigureRouter()

    testServer = httptest.NewServer(router)


    // run tests

    os.Exit(m.Run())

}

最后用go test my/package/router.


查看完整回答
反对 回复 2021-12-27
?
噜噜哒

TA贡献1784条经验 获得超7个赞

也许您可以将要从多个单元测试文件中使用的设置代码放入一个单独的包中,该包仅由单元测试使用?

或者您可以将设置代码放入普通包中,然后在单元测试中使用它。

之前有人问过,但 Go 作者选择不隐式提供测试标签,该标签可用于选择性地启用普通包文件中的函数编译。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号