如何忽略Go测试覆盖范围内生成的文件

时间:2018-04-27 15:14:49

标签: unit-testing testing go build code-coverage

我的包中生成了一个文件,其中DO NOT EDIT位于顶部。我正在使用go test -coverprofile=cover.out <package>为我的包运行测试。这将创建覆盖率配置文件并显示总覆盖百分比但它还包括在计算覆盖范围时生成的文件。有没有办法忽略覆盖率计算中生成的文件?

4 个答案:

答案 0 :(得分:7)

您可以从封面配置文件中删除生成的代码:

go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out

根据使用的工具,这可以在管道/ make中轻松实现。

答案 1 :(得分:5)

大多数Go工具都在包上运行,因为包本身形成了一个可能完整有用的单元。从包中排除文件很容易“破坏”包:被排除的文件可能包含(关键)包初始化代码,甚至可能导致剩余的包文件无法编译。

go test也不例外:它也适用于包。没有第一手支持从包中排除文件。

如果您的软件包可能在没有生成文件的情况下进行编译和测试,您可以选择将文件生成到另一个软件包中,然后它就不会自然地包含在软件包的(覆盖)测试中。

处理此问题的另一种方法是仍然在同一个包/文件夹中生成它,并在生成的文件中使用特殊的构建标记,您可以在运行coverage测试时将其排除。您可以在此处详细了解构建代码:Build Constraints,此处:What is the right approach to encapsulate platform specific code in Go?

如果需要生成的文件来编译/测试包,那么您仍然可以选择:对生成的文件使用内部包。内部包仅适用于以internal文件夹为根的包树,这意味着您可以在内部包中导出任何标识符,编译器确保它们不会被“非预期”方使用。您可以在此处阅读有关内部包的更多信息:Can I develop a go package in multiple source directories?

还要考虑为生成的代码编写或生成测试的选项,这可能是一种很好的做法,因此您不必使用技巧将它们从覆盖测试中排除。

答案 2 :(得分:2)

您可以将这些目录从测试中删除。

所以,而不是:

go test ./...

您这样做:

go test `go list ./... | grep -v ./excluded/autogen/directory/here`

此外,请确保您未添加结尾的/。它并不完美。

答案 3 :(得分:1)

按照我可以解决此需求的方式进行。

通过排除dirs / pkgs

由于要运行测试并生成封面,因此您将在go test命令应在其中查找该pkg中的文件的位置指定pkg,该文件将被自动忽略。遵循示例

project
|_______/pkg/web/app 
|_______/pkg/web/mock -> It will be ignored.

# Command:   
$go test -failfast -tags=integration -coverprofile=coverage.out -covermode=count github.com/aerogear/mobile-security-service/pkg/web/apps

但是,它不能在所有情况下都适用。例如,在文件是接口的模拟例程的情况下,它可能无法很好地工作,因为服务,测试和模拟所需的导入可能会处于一个循环中,并且在这种情况下是不允许的。

在名称定义中使用“ _test”

如果您想忽略测试中使用的文件,请在名称末尾使用_test。例如,my_service_mock_test.go。默认情况下,名称末尾带有_test的文件将被忽略。

通过如下所述从封面文件中删除

go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out

PS .:我找不到排除它们的评论或标签。