iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
1
Software Development

啥物碗Golang? 30天就Go系列 第 21

Benchmarks 壓力測試

昨天我們討論到測試,其實除了一般程式的檢查以外,golang還內建了壓力測試的功能,可以檢查程式的效能。

跟測試一樣,golang是透過函數名稱來識別一個函數是否為壓力測試,命名規則上必須符合:

func BenchmarkXXX(b *testing.B) { ... }

這邊介紹一些壓力測試的特性:

  • 需要注意的是go test預設不會執行壓力測試,必須加上參數go test -test.bench=".*",這樣會執行全部的壓力測試案例。
  • 檔案名稱同測試檔案一樣,必須以_test.go結尾。
  • 函數名稱必須以Benchmark開頭,之後可以接上任何英文字,但首字必須是大寫(原因同昨天的測試)
  • 不可以有返回值
  • for循環很重要,必須把要測試的程式放在裡面
  • b.N是由框架提供的,用來決定測試的次數

我們來看一個完整的例子:

package gotest

import (
	"testing"
)

func Benchmark_Division(b *testing.B) {
	for i := 0; i < b.N; i++ {
		Division(4, 5)
	}
}

程式本體的部分我們沿用昨天的Division,一樣引入testing就可以了,vs code也會支援壓力測試的UI,所以我們可以直接透過介面執行,會得到下面的結果:

Running tool: /usr/local/bin/go test -benchmem -run=^$ -bench ^Benchmark_Division$

goos: darwin
goarch: amd64
Benchmark_Division-8   	2000000000	         0.37 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	_/Users/Chenbater/projects/go/day20	0.785s
Success: Benchmarks passed.

測試報告中2000000000代表這個程式執行的次數,平均0.37奈秒(十億分之一秒),平均使用了0 byte。

我們可以看到整個測試包非常的輕量,而且容易實踐,這樣我們每次在發佈前,都可以確認程式的品質。

Reference


上一篇
Testing 測試
下一篇
Example 示例函數
系列文
啥物碗Golang? 30天就Go30

尚未有邦友留言

立即登入留言