资讯专栏INFORMATION COLUMN

Go单元测试

beanlam / 917人阅读

摘要:单元测试简介单元测试是语言级别提供的完整功能,测试代码以命名,单元测试的以开头,性能测试以开头,运行测试命令例子实现排列组合函数以及对应的单元测试和性能测试创建工程目录结构目录结构说明参见规范项目实现排列组合函数实现单元测试和性能测

Go单元测试 简介

单元测试是go语言级别提供的完整功能,测试代码以*_test.go命名,单元测试的case以Test开头,性能测试case以Benchmark开头,运行测试命令:go test

例子

实现排列组合函数以及对应的单元测试和性能测试

创建工程目录结构

目录结构说明参见规范-项目

└── src
    └── hmath
        ├── hmath.go
        └── hmath_test.go
实现排列组合函数
// src/hmath/hmath.go

package hmath

func combination(m, n int) int {
    if n > m-n {
        n = m - n
    }

    c := 1
    for i := 0; i < n; i++ {
        c *= m - i
        c /= i + 1
    }

    return c
}
实现单元测试和性能测试
// src/hmath/hmath_test.go

package hmath

import (
    "math/rand"
    "testing"
)

// 单元测试
// 测试全局函数,以TestFunction命名
// 测试类成员函数,以TestClass_Function命名
func TestCombination(t *testing.T) {
    // 这里定义一个临时的结构体来存储测试case的参数以及期望的返回值
    for _, unit := range []struct {
        m        int
        n        int
        expected int
    }{
        {1, 0, 1},
        {4, 1, 4},
        {4, 2, 6},
        {4, 3, 4},
        {4, 4, 1},
        {10, 1, 10},
        {10, 3, 120},
        {10, 7, 120},
    } {
        // 调用排列组合函数,与期望的结果比对,如果不一致输出错误
        if actually := combination(unit.m, unit.n); actually != unit.expected {
            t.Errorf("combination: [%v], actually: [%v]", unit, actually)
        }
    }
}

// 性能测试
func BenchmarkCombination(b *testing.B) {
    // b.N会根据函数的运行时间取一个合适的值
    for i := 0; i < b.N; i++ {
        combination(i+1, rand.Intn(i+1))
    }
}

// 并发测试
func BenchmarkCombinationParallel(b *testing.B) {
    // 测试一个对象或者函数在多线程的场景下面是否安全
    b.RunParallel(func(pb *testing.PB) {
        for pb.Next() {
            m := rand.Intn(100) + 1
            n := rand.Intn(m)
            combination(m, n)
        }
    })
}
运行单元测试和性能测试
export GOPATH=$(pwd)
go test src/hmath/*.go           # 单元测试
go test --cover src/hmath/*.go   # 单元测试覆盖率
go test -bench=. src/hmath/*.go  # 性能测试

上面命令的输出如下:

hatlonely@localhost: ~/hatlonely/github/tmp $ go test src/hmath/hmath*.go
ok      command-line-arguments  0.005s
hatlonely@localhost: ~/hatlonely/github/tmp $ go test --cover src/hmath/hmath*.go
ok      command-line-arguments  0.005s  coverage: 100.0% of statements
hatlonely@localhost: ~/hatlonely/github/tmp $ go test -bench=. src/hmath/*.go
BenchmarkCombination-8                100000        217618 ns/op
BenchmarkCombinationParallel-8       3000000           401 ns/op
PASS
ok      command-line-arguments  23.599s

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/8778.html

相关文章

  • Go 单元测试和性能测试

    摘要:测试对于互联网应用软件开发来说非常重要,它对软件可靠性保证具有重要意义,通过测试能够尽可能发现并改正软件中的错误,提高软件质量。这里我们主要讲解语言如何实现单元测试和性能测试。单元测试创建目录,在目录下创建两个文件,为单元测试文件。 测试对于互联网应用软件开发来说非常重要,它对软件可靠性保证具有重要意义,通过测试能够尽可能发现并改正软件中的错误,提高软件质量。 这里我们主要讲解Go语言...

    SimonMa 评论0 收藏0
  • gomock进行mock测试

    摘要:在刚开始的时候,我通常都会先启动一个简单的服务,然后再运行我的单元测试。可是这个单元测试测起来似乎非常笨重。王尼玛张全蛋测试之这是自定义的返回值,可以是任意类型。 在开发过程中往往需要配合单元测试,但是很多时候,单元测试需要依赖一些比较复杂的准备工作,比如需要依赖数据库环境,需要依赖网络环境,单元测试就变成了一件非常麻烦的事情。举例来说,比如我们需要请求一个网页,并将请求回来的数据进行...

    骞讳护 评论0 收藏0
  • Go 语言 Excel 类库 Excelize 2.0.0 版本发布

    摘要:是语言编写的用于操作文档类库,基于标准。可以使用它来读取写入由及以上版本创建的文档。年月日,社区正式发布了版本,该版本包含了很多新功能错误修复和性能优化。 showImg(https://segmentfault.com/img/remote/1460000018971694?w=880&h=360); Excelize 是 Go 语言编写的用于操作 Office Excel 文档类库...

    andycall 评论0 收藏0
  • DM 源码阅读系列文章(一)序

    摘要:内容概要源码阅读系列将会从两条线进行展开,一条是围绕的系统架构和重要模块进行分析,另一条线围绕内部的同步机制展开分析。更多的代码阅读内容会在后面的章节中逐步展开,敬请期待。 作者:杨非 前言 TiDB-DM 是由 PingCAP 开发的一体化数据同步任务管理平台,支持从 MySQL 或 MariaDB 到 TiDB 的全量数据迁移和增量数据同步,在 TiDB DevCon 2019 正...

    Mr_houzi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<