golang testing

概述

func TestXxx(*testing.T)

测试函数的名字,Test要以大写开始。

测试的文件名是 xxx_test.go, "_test.go"结尾,文件内是TestXxx的函数。文件放在被测试模块同一目录。

具体错误可以用testing.T的Errorf来输出。

Benchmarks

func BenchmarkXxx(*testing.B)

go test -bench 将会依序运行benchmarks的用例。example:

func BenchmarkRandInt(b *testing.B) {
    for i := 0; i < b.N; i++ {
        rand.Int()
    }
}

b.N是动态改变的,直到运行次数足够多,能可靠计算每次耗时为止。会有如下输出:

BenchmarkRandInt-8      68453040            17.8 ns/op

如果benchmark需要平行测试性能,可以使用RunParallel函数,一般会go test -cpu flag一起用。

func BenchmarkTemplateParallel(b *testing.B) {
    templ := template.Must(template.New("test").Parse("Hello, {{.}}!"))
    b.RunParallel(func(pb *testing.PB) {
        var buf bytes.Buffer
        for pb.Next() {
            buf.Reset()
            templ.Execute(&buf, "World")
        }
    })
}

Examples

func ExampleHello() {
    fmt.Println("hello")
    // Output: hello
}
​
func ExampleSalutations() {
    fmt.Println("hello, and")
    fmt.Println("goodbye")
    // Output:
    // hello, and
    // goodbye
}

Output那个注释是期待输出,对比结果时,会忽然前导和尾随空白。不按顺序时用Unordered output。

func ExamplePerm() {
    for _, value := range Perm(5) {
        fmt.Println(value)
    }
    // Unordered output: 4
    // 2
    // 1
    // 3
    // 0
}

Example中如果没有output的注释则只编译,不运行。

下面的suffix需要小写开头

func Example_suffix() { ... }
func ExampleF_suffix() { ... }
func ExampleT_suffix() { ... }
func ExampleT_M_suffix() { ... }

Skipping

路过。。

func TestTimeConsuming(t *testing.T) {
    if testing.Short() {
        t.Skip("skipping test in short mode.")
    }
    ...
}

Subtests and Sub-benchmarks

T和B类型中的Run可以定义子测试和子benchmarks,不需要为sub们定义函数。This enables uses like table-driven benchmarks and creating hierarchical tests. It also provides a way to share common setup and tear-down code:(这个可以使用表驱动benchmark和层级式测试,也能提供公共setup和tear-down代码)

func TestFoo(t *testing.T) {
    // <setup code>
    t.Run("A=1", func(t *testing.T) { ... })
    t.Run("A=2", func(t *testing.T) { ... })
    t.Run("B=1", func(t *testing.T) { ... })
    // <tear-down code>
}

运行测试时,可以-run和-bench flags设置运行那些测试:

go test -run ''      # 运行所有测试
go test -run Foo     # 运行一级测试,匹配 "Foo", 例如 "TestFooBar".
go test -run Foo/A=  # 运行一级测试,匹配 "Foo", 运行二级测试,匹配 "A=".
go test -run /A=1    # 运行所有一级测试, 运行二级测试,匹配 "A=1".

子用例可以并行运行,父级仅在所有子用例运行完才完成。

func TestGroupedParallel(t *testing.T) {
    for _, tc := range tests {
        tc := tc // capture range variable
        t.Run(tc.Name, func(t *testing.T) {
            t.Parallel()
            ...
        })
    }
}

子测试间是并行的运行。

Main

有时需要在测试前或测试后有一些设置或tear-down的控制,或者控制那些代码需要在主线程运程,可以在一个文件内添加一个

func TestMain(m *testing.M)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FatherOfCodingMan

如果觉得有用的话,可以赏点饭钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值