本文的目的是对mymysql进行单元测试和性能测试
准备工作:
1
2
3
4
5
6
7
8
9
10
11
12
<code>drop table</code><code>if</code> <code>exists admin;</code>
<code>create table `admin` (</code>
<code> </code><code>`adminid` int(10) unsigned not null auto_increment,</code>
<code> </code><code>`username` varchar(20) not null default</code><code>''</code> <code>comment</code><code>'后台用户名'</code><code>,</code>
<code> </code><code>`password` char(32) not null default</code><code>''</code> <code>comment</code><code>'密码,md5存'</code><code>,</code>
<code> </code><code>primary key(`adminid`)</code>
<code>)</code>
<code>comment=</code><code>'后台用户信息表'</code>
<code>collate=</code><code>'utf8_general_ci'</code>
<code>engine=innodb;</code>
<code>insert into admin set adminid=1, username=</code><code>'admin'</code><code>, password=</code><code>'21232f297a57a5a743894a0e4a801fc3'</code><code>;</code>

13
14
15
16
17
18
19
20
21
22
23
24
25
<code>package mymysql</code>
<code>import(</code>
<code> </code><code>"log"</code>
<code> </code><code>"github.com/ziutek/mymysql/mysql"</code>
<code> </code><code>_</code><code>"github.com/ziutek/mymysql/native"</code>
<code>func getadmin(adminid int) (string, string){</code>
<code> </code><code>db := mysql.new(</code><code>"tcp"</code><code>,</code><code>""</code><code>,</code><code>"127.0.0.1:3306"</code><code>,</code><code>"root"</code><code>,</code><code>"password"</code><code>,</code><code>"test"</code><code>)</code>
<code> </code><code>err := db.connect()</code>
<code> </code><code>if</code> <code>err != nil {</code>
<code> </code><code>panic(err)</code>
<code> </code><code>}</code>
<code> </code><code>rows, res, err := db.query(</code><code>"select * from admin where adminid=%d"</code><code>, adminid)</code>
<code> </code><code>if</code> <code>len(rows) < 1 {</code>
<code> </code><code>log.panic(</code><code>"rows error"</code><code>)</code>
<code> </code><code>row := rows[0]</code>
<code> </code><code>first := res.map(</code><code>"username"</code><code>)</code>
<code> </code><code>second := res.map(</code><code>"password"</code><code>)</code>
<code> </code><code>username, password := row.str(first), row.str(second)</code>
<code> </code><code>return</code> <code>username, password</code>
<code>}</code>
很好理解,根据adminid获取用户名和密码
<code> </code><code>"testing"</code>
<code>func test_getadmin(t *testing.t) {</code>
<code> </code><code>username, _ := getadmin(1)</code>
<code> </code><code>if</code> <code>(username !=</code><code>"admin"</code><code>) {</code>
<code> </code><code>t.error(</code><code>"getadmin get data error"</code><code>)</code>
<code> </code><code>}</code>
<code>}<br>这里做单元测试的,测试getadmin函数</code>
写到这里你就可以在命令行中运行go test了
这里有个 -v参数,如果不加这个参数的话,只会显示错误的测试用例,否则就显示所有的测试用例(成功 + 错误)
mymysql_b_test.go的代码:
<code>import (</code>
<code>func benchmark_getadmin(b *testing.b){</code>
<code> </code><code>for</code> <code>i := 0; i < b.n; i++ {</code><code>//use b.n for looping</code>
<code> </code><code>getadmin(1)</code>
然后运行 go test -v -bench=".*"
这里的-bench是可以指定运行的用例
返回结果表示这个测试用例在1s中内运行了2000次,每次调用大约用了891898ns
使用命令:
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)
显示svg文件已经生成了