开发者社区> 技术mix呢> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

golang test测试实例

简介:
+关注继续查看

本文的目的是对mymysql进行单元测试和性能测试

准备工作:

1 go get github.com/ziutek/mymysql/thrsafe

2 在mysql建表和初始化数据(db是test)

1
2
3
4
5
6
7
8
9
10
11
12
drop table if exists admin;
CREATE TABLE `admin` (
    `adminid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `username` varchar(20) NOT NULL DEFAULT '' COMMENT '后台用户名',
    `password` char(32) NOT NULL DEFAULT '' COMMENT '密码,md5存',
    PRIMARY KEY(`adminid`)
)
COMMENT='后台用户信息表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
 
insert into admin set adminid=1, username='admin', password='21232f297a57a5a743894a0e4a801fc3';

3 gopath下建立mymysql

Image(3)

4 mymysql.go的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package mymysql
import(
     "log"
     "github.com/ziutek/mymysql/mysql"
     _ "github.com/ziutek/mymysql/native"
)
func getAdmin(adminid int) (string, string){
     db := mysql.New("tcp", "", "127.0.0.1:3306", "root", "password", "test")
     err := db.Connect()
     if err != nil {
          panic(err)
     }
     rows, res, err := db.Query("select * from admin where adminid=%d", adminid)
     if err != nil {
          panic(err)
     }
     if len(rows) < 1 {
          log.Panic("rows error")
     }
     row := rows[0]
     first := res.Map("username")
     second := res.Map("password")
     username, password := row.Str(first), row.Str(second)
     return username, password
}

很好理解,根据adminid获取用户名和密码

5 mymysql_test.go的代码:

1
2
3
4
5
6
7
8
9
10
package mymysql
import(
     "testing"
)
func Test_getAdmin(t *testing.T) {
    username, _ := getAdmin(1)
    if (username != "admin") {
         t.Error("getAdmin get data error")
    }
}<br>这里做单元测试的,测试getAdmin函数

写到这里你就可以在命令行中运行go test了

Image(4)

这里有个 -v参数,如果不加这个参数的话,只会显示错误的测试用例,否则就显示所有的测试用例(成功 + 错误)

6 下面做性能测试

mymysql_b_test.go的代码:

1
2
3
4
5
6
7
8
9
package mymysql
import (
     "testing"
)
func Benchmark_getAdmin(b *testing.B){
     for i := 0; i < b.N; i++ { //use b.N for looping
            getAdmin(1)
    }
}

然后运行 go test -v -bench=".*"

这里的-bench是可以指定运行的用例

Image(5)

返回结果表示这个测试用例在1s中内运行了2000次,每次调用大约用了891898ns

7 用性能测试生成CPU状态图

使用命令:

go test -bench=".*" -cpuprofile=cpu.prof -c

cpuprofile是表示生成的cpu profile文件

-c是生成可执行的二进制文件,这个是生成状态图必须的,它会在本目录下生成可执行文件mymysql.test

然后使用go tool pprof工具

go tool pprof mymysql.test cpu.prof

 

调用web(需要安装graphviz)

Image(6)

显示svg文件已经生成了

Image(7)






本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2013/01/18/2865915.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Go语言出现后,Java还是最佳选择吗?
阿里妹导读:随着大量新生的异步框架和支持协程的语言(如Go)的出现,在很多场景下操作系统的线程调度成为了性能的瓶颈,Java也因此被质疑是否不再适应最新的云场景了。4年前,阿里JVM团队开始自研Wisp2,将Go语言的协程能力带入到Java世界。
36528 0
dotweb——go语言的一个微型web框架(三)路由注册
上一章我们讲了如何启动一个dotweb程序,本篇文章将介绍如何注册路由。 router是dotweb用来管理路由的结构体,它提供了一些关于路由操作函数。 app := dotweb.New() router := app.HttpServer.Router() 在上一篇文章中我们讲了dotweb.New()的用处,HttpServer负责处理请求,管理路由、session、中间件等等功能。
982 0
go语言学习与面向对象再思考
据说Smalltalk发明者Alan Kay就曾经说过: 我发明了面向对象,而我可以告诉你C++并不是我头脑里所想的东西. 面向对象的困惑 计算机里面只有数据和算法,数据用于对现实世界抽象建模,算法对数据演算,这已经很好,怎么出来一个面向对象这个"怪胎". 面向对象教学每次都要从对现实世
1910 0
golang错题集
本文即Go语言的那些坑三。
3704 0
golang之pkg(包)
一、概述   Golang拥有超过100个标准包(可用go list std |wc -l查看)   任何包系统设计的目的都是简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的模块以便于理解和更新,在每个模块更新的同时保持和程序中其他模块的相对独立,这种模块化的特性允许每个包能被其他的不同项目共享和重用,在项目范围内、全局范围内的复用;   每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。
1934 0
+关注
2968
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载