golang 单元测试覆盖率

单元测试是代码质量的重要保证,测试覆盖率是关键的衡量指标。

在golang 中,通过go test 进行单元测试,并可以分析覆盖率。

单元测试覆盖率

示例代码

首先看下示例代码。

新建目录utils,目录有以下文件

 ll
total 16
-rw-r--r--  1 lanyang  staff   132B 12 31 21:09 add_hint.go
-rw-r--r--  1 lanyang  staff   360B 12 31 21:09 add_hint_test.go

add_hint.go 文件内容如下:

package utils

func AddPrefix(s string) string {

        return "good " + s
}



func AddSuffix(s string) string {

        return s + "!"
}

add_hint_test.go 文件内容如下:

package utils

import (
        "testing"
        "strings"
)


func TestAddPrefix(t *testing.T) {

        src := "boy"
        dst := AddPrefix(src)

        if !strings.HasPrefix(dst, "good") {
                t.Fatalf("unexpected dst:%s", dst)
        }
}

func TestAddSufffix(t *testing.T) {
        src := "good"
        dst := AddSuffix(src)

        if !strings.HasSuffix(dst, "!") {
                t.Fatalf("unexpected dst:%s", dst)
        }
}

以上代码分别在字符串头部和尾部分别添加字符串前缀和后缀。

执行单元测试

go test -v -covermode=set -coverprofile=hint_test.out ./
=== RUN   TestAddPrefix
--- PASS: TestAddPrefix (0.00s)
=== RUN   TestAddSufffix
--- PASS: TestAddSufffix (0.00s)
PASS
coverage: 100.0% of statements
ok  	_/go_exercise/utils	0.007s	coverage: 100.0% of statements

从终端输出,可以看到整体的测试情况。

其中,

-covermode 有三种模式:

  • set 语句是否执行,默认模式
  • count 每个语句执行次数
  • atomic 类似于count,表示并发程序中的精确技术

-coverprofile是统计信息保存的文件。

这里指定的输出文件是hint_test.out,其内容如下:

mode: set
/go_exercise/utils/add_hint.go:4.33,7.2 1 1
/go_exercise/utils/add_hint.go:11.33,14.2 1 1

生成coverprofile后,当前目录下文件列表如下:

ll
total 24
-rw-r--r--  1 lanyang  staff   132B 12 31 21:09 add_hint.go
-rw-r--r--  1 lanyang  staff   457B  1  2 20:37 add_hint_test.go
-rw-r--r--  1 lanyang  staff   164B  1  2 20:38 hint_test.out

查看具体的测试覆盖情况

上面终端输出中,可以看到整体的覆盖率。但没有每个更具体的覆盖情况。

下面通过使用刚才生成的profile文件具体看下覆盖情况。

(1)查看每个函数的覆盖情况:

 go tool cover -func=hint_test.out
/go_exercise/utils/add_hint.go:4:	AddPrefix	100.0%
/go_exercise/utils/add_hint.go:11:	AddSuffix	100.0%
total:									(statements)	100.0%

(2)使用网页方式展示覆盖率情况

go tool cover -html=hint_test.out

执行命令后,跳出浏览器页面以图形化的方式展示测试覆盖情况。

在这里插入图片描述

从图中可以看到,根据颜色就可以分辨出哪些代码已覆盖,哪些代码没覆盖。

如果需要测试当前目录下所有package 的单元测试覆盖情况,可执行

go test -v -covermod=set -coverprofile=all_pkg.out ./...

./... 表示当前目录及其子目录下的所有package。

参考

Go的测试覆盖率

GO Command cover

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Golang中,单元测试是开发人员在编写代码时编写的一种测试方法,它关注代码的局部而不是整体。单元测试的目的是验证代码的各个单元(函数、方法、类等)是否按照预期工作。单元测试通常比其他测试运行得更快,并且可以帮助开发人员在代码编写过程中及时发现和修复问题。\[1\] 在Golang中,我们可以使用testing包来编写和运行单元测试。在测试函数中,我们可以使用testing.T类型的参数来进行断言和错误报告。如果需要跳过某个测试,可以使用testing.T的Skip方法。例如,可以使用testing.Short()函数来判断是否在短模式下运行测试,并使用t.Skip方法跳过测试。\[2\] 要运行Golang单元测试,可以使用go test命令。默认情况下,go test会运行当前目录下的所有测试文件。可以使用-v选项来输出详细的日志信息。测试运行成功时,会显示PASS,测试失败时,会显示FAIL。如果只想测试单个文件,可以在go test命令后面加上被测试的原文件。如果只想测试单个方法,可以使用-run选项指定要运行的测试方法的名称。\[3\] 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *2* [Golang单元测试](https://blog.csdn.net/LinAndCurry/article/details/122324323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Golang-单元测试](https://blog.csdn.net/ALEX_CYL/article/details/121793330)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值