如何忽略 Go 测试覆盖率中生成的文件
How to ignore generated files from Go test coverage
我的包中有一个生成的文件,顶部有 DO NOT EDIT
。我正在 运行 使用 go test -coverprofile=cover.out <package>
测试我的包裹。这将创建覆盖率概况并显示总覆盖率。但它还包括在计算覆盖率时生成的文件。有没有办法在覆盖率计算中忽略生成的文件?
大多数 Go 工具都对包进行操作,因为包本身形成了一个 单元 ,它可能作为一个整体很有用。从包中排除文件很容易 "break" 包:排除的文件可能包含(关键的)包初始化代码,甚至可能导致剩余的包文件无法编译。
go test
也不例外:它也对包进行操作。没有从包中排除文件的第一手支持。
如果你的包可以在没有生成文件的情况下进行编译和测试,你可以选择将文件生成到不同的包中,这样它就不会自然地包含在你的包的(覆盖率)测试中。
处理这个问题的另一种方法是仍然在同一个包/文件夹中生成它,并在生成的文件中使用特殊的构建标签,您可以在 运行 覆盖测试时排除它。您可以在此处阅读有关构建标签的更多信息:Build Constraints, and here:
如果需要生成的文件来编译/测试包,那么您还有一个选择:为生成的文件使用内部包。内部包仅适用于以 internal
文件夹为根的包树,这意味着您可以导出内部包中的任何标识符,编译器确保它们不会被 "unintended" 方使用。您可以在此处阅读有关内部包的更多信息:
还要考虑为生成的代码编写或生成测试的选项,无论如何这可能是一种很好的做法,这样您就不必使用技巧将它们排除在覆盖率测试之外。
您可以从封面配置文件中删除生成的代码:
go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out
根据使用的工具,这可以在 pipeline/make 中轻松实现。
按照我可以解决这个需求的方法。
排除dirs/pkgs
自从 运行 测试并生成封面后,您将指定 pkgs,go test 命令应从该 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.: 我找不到排除它们的评论或标签。
您可以从测试中 grep 出这些目录。
所以,而不是:
go test ./...
你这样做:
go test `go list ./... | grep -v ./excluded/autogen/directory/here`
此外,请确保您没有添加尾随 /
。它不能完美地工作。
我的包中有一个生成的文件,顶部有 DO NOT EDIT
。我正在 运行 使用 go test -coverprofile=cover.out <package>
测试我的包裹。这将创建覆盖率概况并显示总覆盖率。但它还包括在计算覆盖率时生成的文件。有没有办法在覆盖率计算中忽略生成的文件?
大多数 Go 工具都对包进行操作,因为包本身形成了一个 单元 ,它可能作为一个整体很有用。从包中排除文件很容易 "break" 包:排除的文件可能包含(关键的)包初始化代码,甚至可能导致剩余的包文件无法编译。
go test
也不例外:它也对包进行操作。没有从包中排除文件的第一手支持。
如果你的包可以在没有生成文件的情况下进行编译和测试,你可以选择将文件生成到不同的包中,这样它就不会自然地包含在你的包的(覆盖率)测试中。
处理这个问题的另一种方法是仍然在同一个包/文件夹中生成它,并在生成的文件中使用特殊的构建标签,您可以在 运行 覆盖测试时排除它。您可以在此处阅读有关构建标签的更多信息:Build Constraints, and here:
如果需要生成的文件来编译/测试包,那么您还有一个选择:为生成的文件使用内部包。内部包仅适用于以 internal
文件夹为根的包树,这意味着您可以导出内部包中的任何标识符,编译器确保它们不会被 "unintended" 方使用。您可以在此处阅读有关内部包的更多信息:
还要考虑为生成的代码编写或生成测试的选项,无论如何这可能是一种很好的做法,这样您就不必使用技巧将它们排除在覆盖率测试之外。
您可以从封面配置文件中删除生成的代码:
go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out
根据使用的工具,这可以在 pipeline/make 中轻松实现。
按照我可以解决这个需求的方法。
排除dirs/pkgs
自从 运行 测试并生成封面后,您将指定 pkgs,go test 命令应从该 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.: 我找不到排除它们的评论或标签。
您可以从测试中 grep 出这些目录。
所以,而不是:
go test ./...
你这样做:
go test `go list ./... | grep -v ./excluded/autogen/directory/here`
此外,请确保您没有添加尾随 /
。它不能完美地工作。