预定义test.coverprofile标志

时间:2016-08-05 10:51:00

标签: bash go

我正在使用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二进制文件会很好调用

我看到了两种可能的解决方案:

  1. 在go代码中设置-test.coverprofile。怎么做?
  2. 使用bash用预定义标志包装二进制文件。但在这种情况下,不应该有额外的文件。它必须是唯一具有预定义flags.test标志的-test.coverprofile。怎么做?
  3. 我感谢任何建议。感谢

    更新

    我正在尝试运行@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
    

1 个答案:

答案 0 :(得分:0)

如果你必须这样做,你可以做以下事情 - 这个想法是打包"原作"将二进制文件测试到您将分发的那个,并将解压缩"原始"并使用所需的参数调用它:

  • 安装go-bindatago get -u github.com/jteeuwen/go-bindata/...
  • 创建测试可执行文件flags.testgo test -c -cover
  • 创建一个包装器.go文件(例如,wrapper.go):go-bindata -o wrapper.go flags.test
  • 编辑wrapper.go文件以添加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