我正在使用go工具分析代码覆盖率。 首先,我创建测试二进制文件
go test -coverpkg="github.com/ypapax/flags" -c
然后我跑吧
./flags.test -test.coverprofile=/tmp/out.out
cat /tmp/out.out
并查看个人资料内容
PASS
coverage: 100.0% of statements in github.com/ypapax/flags
mode: set
github.com/ypapax/flags/main.go:5.12,7.2 1 1
问题是:
是否可以预定义标志-test.coverprofile=/tmp/out.out
,以便我可以在没有test.coverprofile
标志的情况下运行
./flags.test
cat /tmp/out.out
仍然可以看到/tmp/out.out
内容。
我的测试代码:
package main
import "testing"
func TestRunMain(t *testing.T) {
main()
}
我的主要代码:
package main
import "time"
func main(){
time.Sleep(time.Second)
}
完整的代码在这里:
go get github.com/ypapax/flags && cd $GOPATH/src/github.com/ypapax/flags
我的问题可能看起来很奇怪,但是如果已经编写了许多调用flags.test
二进制文件的函数测试可能会有所帮助,那么避免将-test.coverprofile
添加到每个flags.test
二进制文件会很好调用
我看到了两种可能的解决方案:
-test.coverprofile
。怎么做?flags.test
标志的-test.coverprofile
。怎么做?我感谢任何建议。感谢
我正在尝试运行@dmitris回答
package main
import (
"io/ioutil"
"os/exec"
"log"
"fmt"
. "github.com/jteeuwen/go-bindata"
)
func main() {
prog, err := Asset("flags.test")
if err != nil {
panic(err)
}
dest := "/tmp/flags.test" // could also use https://golang.org/pkg/io/ioutil/#TempFile
coverProfile := "/tmp/flagstest.out"
err = ioutil.WriteFile(dest, prog, 0755)
if err != nil {
panic(err)
}
cmd := exec.Command(dest, "-test.coverprofile", coverProfile)
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("Output: %s, Error: %s", string(output), err)
}
fmt.Println(string(output))
fmt.Println("Coverprofile saved to ", coverProfile)
}
不清楚在Asset
行导入prog, err := Asset("flags.test")
func的位置。
正在运行go build -o wrapper wrapper.go
给我
./wrapper.go:13: cannot convert "flags.test" (type string) to type bindata.Asset
./wrapper.go:13: assignment count mismatch: 2 = 1
答案 0 :(得分:0)
如果你必须这样做,你可以做以下事情 - 这个想法是打包"原作"将二进制文件测试到您将分发的那个,并将解压缩"原始"并使用所需的参数调用它:
go-bindata
:go get -u github.com/jteeuwen/go-bindata/...
flags.test
:go test -c -cover
go-bindata -o wrapper.go flags.test
main
函数以提取二进制文件并使用所需的参数调用它:wrapper.go
func main() {
prog, err := Asset("flags.test")
if err != nil {
panic(err)
}
dest := "/tmp/flags.test" // could also use https://golang.org/pkg/io/ioutil/#TempFile
coverProfile := "/tmp/flagstest.out"
err = ioutil.WriteFile(dest, prog, 0755)
if err != nil {
panic(err)
}
cmd := exec.Command(dest, "-test.coverprofile", coverProfile)
output, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("Output: %s, Error: %s", string(output), err)
}
fmt.Println(string(output))
fmt.Println("Coverprofile saved to ", coverProfile)
}
go build -o wrapper wrapper.go
输出:
$ go run wrapper.go
PASS
coverage: 100.0% of statements
Coverprofile saved to /tmp/flagstest.out