如何在Go中将所有包的代码覆盖在一起?

Ran*_*ana 13 unit-testing code-coverage go

我有一个由几个包组成的库.在运行测试时,我使用'-cover'标志并单独显示每个包的覆盖信息.如下所示:

--- PASS: TestSampleTestSuite (0.00s)
PASS
coverage: 28.7% of statements
ok      github.com/path/to/package1 13.021s
?       github.com/path/to/package2 [no test files]

=== RUN   TestAbc
--- PASS: TestAbc (0.43s)
PASS
coverage: 27.7% of statements
Run Code Online (Sandbox Code Playgroud)

有没有办法轻松获得完整的覆盖率概述,以便对整个项目的覆盖率有所了解?

更新:这是我正在使用的go测试命令

go test ./... -v -short -p 1 -cover
Run Code Online (Sandbox Code Playgroud)

Hec*_*orJ 6

这是从https://github.com/h12w/gosweep中提取的bash脚本:

#!/bin/bash
set -e

echo 'mode: count' > profile.cov

for dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -type d);
do
if ls $dir/*.go &> /dev/null; then
    go test -short -covermode=count -coverprofile=$dir/profile.tmp $dir
    if [ -f $dir/profile.tmp ]
    then
        cat $dir/profile.tmp | tail -n +2 >> profile.cov
        rm $dir/profile.tmp
    fi
fi
done

go tool cover -func profile.cov
Run Code Online (Sandbox Code Playgroud)

  • 这给了我一个"错误的模式行"错误. (4认同)
  • 我认为这只会对那些有一些测试的文件产生覆盖吗?此外,我还必须添加 `-not -path './vendor/*'` 以忽略供应商包。 (2认同)
  • @danielcooperxyz 是正确的。没有测试的包将生成包含“mode: count”的 1 行配置文件。tail 命令将删除此行,并且不会向 profile.cov 中添加任何内容。这会阻止“go tool cover -func profile.cov”准确计算总覆盖范围。就其价值而言,“go test -coverprofile=profile.cov ./...”在功能上与该脚本的大部分内容相同,并且存在同样的不准确性。 (2认同)