我有一个关于在Go(lang)项目中生成代码覆盖率的问题。我有一个简单的结构:
ROOT/
config/
handlers/
lib/
models/
router/
main.go
config
包含JSON中的配置和一个简单的config.go
,它读取和解析JSON文件并填充Config
结构,然后在初始化数据库连接时使用该结构。 handlers
包含控制器(即router/routes.go
中描述的相应METHOD + URL的处理程序)。 lib
包含一些数据库,请求响应器和记录器逻辑。 models
包含要映射到JSON和DB的结构及其功能。最后,router
包含路由器和路由定义。基本上,仅通过测试一个处理程序,就可以确保调用我的配置,记录器,数据库,响应器,路由器和相应的模型(并以某种方式进行了测试)。
现在,如果这将是PHP或Java,或者我不知道其他语言,那么拥有并运行该单个处理程序测试将为所有其他被调用的代码部分创建代码覆盖率,即使它们位于不同的文件夹中(即此处的软件包) )。不幸的是,Go中并非如此。
而且在我的大多数
lib
文件中,只有一种方法的代码很少(例如InitDB()
或ReadConfig()
或NewRouter()
或Logger()
),因此要能够覆盖它们的代码,我必须在这些软件包中同时创建愚蠢的测试已经通过测试主要的URL处理包进行了调用和测试。有什么方法可以从包中获得代码覆盖率,也可以从一个项目中包含的其他包中获得代码覆盖率?
最佳答案
您可以在单个测试中导入软件包,并根据在应用程序中的使用方式为其编写测试。例如,您可以有一个测试,main_test.go
,它会导入所有其他包,然后为导入的包中的方法编写测试。
像这样(在main_test.go中):
package main
import (
"testing"
"lib"
"models"
"handlers"
// etc
)
// testing code here
但是,以我个人的观点,最好确保每个程序包都能做到且仅能做到。最好的方法是通过使用其自己的测试套件测试单个程序包本身。