Did you know that Go 1.2 will ship with a built in test coverage tool ? The tool is integrated into go test and works similarly to the profiling tool, producing an output file which is interpreted by a second command.

If you have Go 1.2rc2 or tip installed, you can use this short shell function to automate the basic usage of the cover tool to produce a per function coverage breakdown.

cover () { t=$(tempfile) go test -coverprofile=$t $@ && go tool cover -func=$t && unlink $t }

Usage is straight forward, just call cover with no argument for the package in your current working directory, or pass the name of a package.

% cover bytes ok bytes 7.770s coverage: 91.6% of statements bytes/buffer.go: Bytes 100.0% bytes/buffer.go: String 100.0% bytes/buffer.go: Len 100.0% bytes/buffer.go: Truncate 100.0% bytes/buffer.go: Reset 100.0% bytes/buffer.go: grow 100.0% bytes/buffer.go: Grow 100.0% bytes/buffer.go: Write 100.0% bytes/buffer.go: WriteString 100.0% bytes/buffer.go: ReadFrom 94.7% bytes/buffer.go: makeSlice 75.0% bytes/buffer.go: WriteTo 78.6% bytes/buffer.go: WriteByte 100.0% bytes/buffer.go: WriteRune 100.0% bytes/buffer.go: Read 100.0% bytes/buffer.go: Next 100.0% bytes/buffer.go: ReadByte 100.0% bytes/buffer.go: ReadRune 83.3% bytes/buffer.go: UnreadRune 85.7% bytes/buffer.go: UnreadByte 100.0% bytes/buffer.go: ReadBytes 100.0% bytes/buffer.go: readSlice 100.0% bytes/buffer.go: ReadString 100.0% bytes/buffer.go: NewBuffer 100.0% bytes/buffer.go: NewBufferString 100.0% bytes/bytes.go: equalPortable 100.0% bytes/bytes.go: explode 100.0% bytes/bytes.go: Count 100.0% bytes/bytes.go: Contains 0.0% bytes/bytes.go: Index 100.0% bytes/bytes.go: indexBytePortable 100.0% bytes/bytes.go: LastIndex 100.0% bytes/bytes.go: IndexRune 100.0% bytes/bytes.go: IndexAny 100.0% bytes/bytes.go: LastIndexAny 100.0% bytes/bytes.go: genSplit 100.0% bytes/bytes.go: SplitN 100.0% bytes/bytes.go: SplitAfterN 100.0% bytes/bytes.go: Split 100.0% bytes/bytes.go: SplitAfter 100.0% bytes/bytes.go: Fields 100.0% bytes/bytes.go: FieldsFunc 100.0% bytes/bytes.go: Join 100.0% bytes/bytes.go: HasPrefix 100.0% bytes/bytes.go: HasSuffix 100.0% bytes/bytes.go: Map 100.0% bytes/bytes.go: Repeat 100.0% bytes/bytes.go: ToUpper 100.0% bytes/bytes.go: ToLower 100.0% bytes/bytes.go: ToTitle 100.0% bytes/bytes.go: ToUpperSpecial 0.0% bytes/bytes.go: ToLowerSpecial 0.0% bytes/bytes.go: ToTitleSpecial 0.0% bytes/bytes.go: isSeparator 80.0% bytes/bytes.go: Title 100.0% bytes/bytes.go: TrimLeftFunc 100.0% bytes/bytes.go: TrimRightFunc 100.0% bytes/bytes.go: TrimFunc 100.0% bytes/bytes.go: TrimPrefix 100.0% bytes/bytes.go: TrimSuffix 100.0% bytes/bytes.go: IndexFunc 100.0% bytes/bytes.go: LastIndexFunc 100.0% bytes/bytes.go: indexFunc 100.0% bytes/bytes.go: lastIndexFunc 100.0% bytes/bytes.go: makeCutsetFunc 100.0% bytes/bytes.go: Trim 100.0% bytes/bytes.go: TrimLeft 100.0% bytes/bytes.go: TrimRight 100.0% bytes/bytes.go: TrimSpace 100.0% bytes/bytes.go: Runes 100.0% bytes/bytes.go: Replace 100.0% bytes/bytes.go: EqualFold 100.0% bytes/reader.go: Len 100.0% bytes/reader.go: Read 100.0% bytes/reader.go: ReadAt 100.0% bytes/reader.go: ReadByte 0.0% bytes/reader.go: UnreadByte 0.0% bytes/reader.go: ReadRune 0.0% bytes/reader.go: UnreadRune 0.0% bytes/reader.go: Seek 91.7% bytes/reader.go: WriteTo 83.3% bytes/reader.go: NewReader 100.0% total: (statements) 91.6%