首页 >后端开发 >Golang >如何在与编译的 Go 二进制文件交互的功能测试中实现全面的覆盖率配置文件而没有盲点?

如何在与编译的 Go 二进制文件交互的功能测试中实现全面的覆盖率配置文件而没有盲点?

Susan Sarandon
Susan Sarandon原创
2024-10-25 07:14:29609浏览

How to achieve comprehensive coverage profiles without blind spots for functional tests interacting with a compiled Go binary?

显示无盲点的功能测试覆盖率

问题:

为了生成用于以非 Go 语言编写的与已编译的 Go 二进制文件交互的功能测试的覆盖率配置文件,main_test.go 文件包含一个 Test_main 函数,该函数修改 main() 方法以将退出代码发送到通道。但是, exit() 函数中的 if flag.Lookup("test.coverprofile") != nil 条件会在覆盖率结果中产生盲点,因为当请求覆盖率配置文件时 os.Exit(code) 可能永远不会被执行.

解决方案:

为了编写没有盲点的覆盖率配置文件,建议从测试中排除 main.go 文件。这可以使用构建标签来完成,方法是将行 // build !test 添加到 main.go 文件的顶部。这将指示 Go 编译器在测试构建期间忽略该文件。

以下是包含此方法的示例代码的修改版本:

<code class="go">// dofunc.go
package main

import (
    "fmt"
    "math/rand"
    "time"
)

var seed int64 = time.Now().UTC().UnixNano()

func doFunc() int {
    rand.Seed(seed)
    var code int
    for {
        i := rand.Int()
        fmt.Println(i)
        if i%3 == 0 {
            code = 0
            break
        }
        if i%2 == 0 {
            fmt.Println("status 1")
            code = 1
            break
        }
        time.Sleep(time.Second)
    }
    return code
}

// main.go
//+build !test
package main

import "os"

func main() {
    os.Exit(doFunc())
}

// dofunc_test.go
package main

import (
    "testing"
    "flag"
    "os"
)

var exitCode int

func TestMain(m *testing.M) {
    flag.Parse()
    code := m.Run()
    os.Exit(code)
}

func TestDoFuncErrorCodeZero(t *testing.T) {
    seed = 2

    if code := doFunc(); code != 0 {
        t.Fail()
    }
}

func TestDoFuncErrorCodeOne(t *testing.T) {
    seed = 3

    if code := doFunc(); code != 1 {
        t.Fail()
    }
}</code>

用法:

  1. 使用标签构建覆盖二进制文件:go test -c -coverpkg=。 -o myProgram -tags test
  2. 运行覆盖率二进制文件:./myProgram -test.coverprofile=/tmp/profile
  3. 生成覆盖率 HTML 报告:go tool cover -html /tmp/profile -o /tmp/profile.html

通过从测试中排除 main.go,exit() 函数不再是覆盖率分析的一部分,并且覆盖率配置文件将准确反映功能测试。

以上是如何在与编译的 Go 二进制文件交互的功能测试中实现全面的覆盖率配置文件而没有盲点?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn