【GoLang】GoLang 单元测试、性能测试使用方法

单元测试代码:

ackage test

import (
    // "fmt"
    "testing"
)

func Test_FlowControl(t *testing.T) {
    var x int64 = 10
    if x == 10 {
        // fmt.Println("x is  10")
        t.Log("x is  10")
    } else {
        // fmt.Println("x is not 10")
        t.Log("x is not 10")
    }
    t.Log(x)
}

性能测试代码:

package test

import (
    // "fmt"
    "testing"
)

func Benchmark_FlowControl(b *testing.B) {
    for i := 0; i < b.N; i++ { //use b.N for looping
        b.Log(i)
    }
}

1.创建测试文件夹mysql,文件夹下的go文件的package必须与文件夹名一致(不然会识别不到)

2.创建需要测试的文件mysql.go(使用github.com/go-sql-driver/mysql包)

package mysql

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

func findByPk(pk int) int {
    var num int = 0
    db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/plugin_master?charset=utf8")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()
    stmtOut, err := db.Prepare("select id from t_admin where id=?")
    if err != nil {
        panic(err.Error())
    }
    defer stmtOut.Close()

    err = stmtOut.QueryRow(pk).Scan(&num)
    if err != nil {
        panic(err.Error())
    }
    return num
}

3.创建单元测试用例文件mysql_test.go(文件名必须是*_test.go的类型,*代表要测试的文件名,函数名必须以Test开头如:TestXxx或Test_xxx)

package mysql

import (
    "testing"
)

func Test_findByPk(t *testing.T) {
    num := findByPk(1)
    t.Log(num)
}

测试所有的文件 go test,将对当前目录下的所有*_test.go文件进行编译并自动运行测试。
测试某个文件使用”-file”参数。go test –file *.go 。例如:go test -file mysql_test.go,"-file"参数不是必须的,可以省略,如果你输入go test b_test.go也会得到一样的效果。
测试某个方法 go test -run=‘Test_xxx‘"-v" 参数 go test -v ... 表示无论用例是否测试通过都会显示结果,不加"-v"表示只显示未通过的用例结果

4.创建benchmark性能测试用例文件mysql_b_test.go(文件名必须是*_b_test.go的类型,*代表要测试的文件名,函数名必须以Benchmark开头如:BenchmarkXxx或Benchmark_xxx)

package mysql

import (
    "testing"
)

func Benchmark_findByPk(b *testing.B) {
    for i := 0; i < b.N; i++ { //use b.N for looping
        findByPk(1)
    }
}

进行所有go文件的benchmark测试 go test -bench=".*" 或 go test . -bench=".*"
对某个go文件进行benchmark测试 go test mysql_b_test.go -bench=".*"

5.用性能测试生成CPU状态图(暂未测试使用)

使用命令:
go test -bench=".*" -cpuprofile=cpu.prof -c
cpuprofile是表示生成的cpu profile文件
-c是生成可执行的二进制文件,这个是生成状态图必须的,它会在本目录下生成可执行文件mysql.test
然后使用go tool pprof工具
go tool pprof mysql.test cpu.prof
调用web(需要安装graphviz)来生成svg文件,生成后使用浏览器查看svg文件参考 http://www.cnblogs.com/yjf512/archive/2013/01/18/2865915.html参考资料:http://studygolang.com/articles/2491http://www.01happy.com/golang-unit-testing/http://www.cnblogs.com/yjf512/archive/2013/01/18/2865915.htmlhttp://blog.csdn.net/samxx8/article/details/46894587http://www.phpddt.com/go/go-testing.html
时间: 2024-10-04 15:22:51

【GoLang】GoLang 单元测试、性能测试使用方法的相关文章

golang 单元测试&amp;&amp;性能测试

一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必须以Test开头,是可导出公开的函数 测试函数的签名必须接收一个指向testing.T类型的指针,并且不能返回任何值 3.golang单元测试组 有好几个不同的输入以及输出组成的一组单元测试 4.测试覆盖率 go test -cover 直接输出覆盖率 go test -run TestAll 指定

golang导出csv乱码解决方法

golang导出csv乱码解决方法: 在csv文件的开头写入 UTF-8 BOM // 创建文件 dstf, err := os.Create(``"./data/" + fileName) defer dstf.Close() if err != nil { beego.Error(``"create file error: " + err.Error()) return ""``, err } `dstf.WriteString(``&quo

Jmeter - 在Linux执行性能测试的方法 [1]

前面讲过在Windows执行性能测试的方法,就是这篇了<jmeter - 一个完整的接口测试的脚本>, 在Windows执行性能测试之前,首先要有1个性能测试脚本嘛, 但是这个性能测试脚本是不是直接可以在Linux上面使用?当然可以了. 那什么时候不可以呢?参数化的时候不可以,因为需要读本地的.csv文件,路经需要修改一小下. 因此,才有了另一篇<Jmeter - 构建1个可供Linux使用的Jmeter测试脚本 - 共3个步骤>. 那么,已经讲到:已经构建好了可供Linux使用的

GOLANG 加密,解密,GUID 小方法

golang的 MD5加密.BASE64解密  guid 的代码: /** * 用于加密,解密,(包含MD5加密和base64加密/解密)以及GUID的生成 * 时间: * zhifieya */ package safe import ( "crypto/md5" "crypto/rand" "crypto/sha1" "encoding/base64" "encoding/hex" "io&q

golang学习之旅:方法、函数使用心得

假设要在$GOPATH/pkg/$GOOS_$GOARCH/basepath/ProjectName/目录下开发一个名为xxx的package.(这里basepath指的是github.com/michael-lau) 步骤如下: 在$GOPATH/pkg/$GOOS_$GOARCH/basepath/ProjectName/目录下新建一个目录,命名为A(目录的名字可以任取,和包名没有关系,只要最终客户端程序import的时候保持和这个目录一致即可.不过推荐和包名一致). 然后在A这个目录下编写

golang 往页面写入内容方法

有时候需要往浏览器访问的页面中输出调试信息,可以使用以下方法 import ( "fmt" "html/template" "io" "log" "net/http" ) func writeHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello")) io.WriteString(w, "

golang之结构体和方法

结构体的定义 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. 其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语言放弃了包括继承在内的大量面向对象的特性,只保留了组合这个基础的特性.所有的Go语言类型除了指针类型外,都可以有自己的方法. 先通过一个下的例子理解struct. package main import "fmt" type Student struct { Name string Age

golang通过反射动态调用方法

func Call(m map[string]interface{}, name string, params ...interface{}) ([]reflect.Value, error) { f := reflect.ValueOf(m[name]) if len(params) != f.Type().NumIn() { return nil, errors.New("the number of input params not match!") } in := make([]

Golang channel 的基本使用方法

package main import ( "fmt" "learner/Add" "time" ) //a. 普通类型,普通变量保存的就是值,也叫值类型 //b. 获取普通变量的内存地址,用&,比如: var a int, 获取a的内存地址:&a //c. 指针类型,指针变量存的就是一个内存地址,这个地址指向值 //d. 获取指针类型所指向的值,使用:*,比如:var *p int, 使用*p获取p指向的值 //e. 将一个内存