這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本文的目的是對mymysql進行單元測試和效能測試
準備工作:
1 go get github.com/ziutek/mymysql/thrsafe
2 在mysql建表和初始化資料(db是test)
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
4 mymysql.go的代碼:
package mymysqlimport( "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的代碼:
package mymysqlimport( "testing")func Test_getAdmin(t *testing.T) { username, _ := getAdmin(1) if (username != "admin") { t.Error("getAdmin get data error") }}
這裡做單元測試的,測試getAdmin函數
寫到這裡你就可以在命令列中運行go test了
這裡有個 -v參數,如果不加這個參數的話,只會顯示錯誤的測試案例,否則就顯示所有的測試案例(成功 + 錯誤)
6 下面做效能測試
mymysql_b_test.go的代碼:
package mymysqlimport ( "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是可以指定啟動並執行用例
返回結果表示這個測試案例在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)
顯示svg檔案已經產生了