go基礎筆記----測試與性能調優

 

package main

import (
	"fmt"
	"math"
)

// debugging sucks! Testing Rocks!

/*
	傳統測試
	缺點{
		1.測試數據和測試邏輯混在一起
		2.出錯信息不明確
		3.一旦一個數據出錯測試全部結束
	}

	表格驅動測試
	優點{
		1.分離的測試數據和測試邏輯
		2.明確的出錯信息
		3.可以部分失敗
		4.go語言的語法使得我們更易實踐表格驅動測試
	}
*/

func triangle() {
	var a, b int = 3, 4
	fmt.Println(calcTriangle(a, b))
}

func calcTriangle(a, b int) int {
	var c int
	c = int(math.Sqrt(float64(a*a + b*b)))
	return c
}

func main() {
	fmt.Println("1111")
	fmt.Println("2222")
	fmt.Println("3333")
}
package main

import "testing"

/*
	啓動測試命令
	運行:在當前路徑下面 go test .
	測試覆蓋率:go test -coverprofile=c.out // windows 下測試失敗
	benchmark啓動: go test -bench .
	查看性能:go test -bench . -cpuprofile cpu.out
	使用pprof查看代碼性能:go tool pprof cpu.out
*/

// 功能測試
func TestSubstr(t *testing.T) {
	tests := []struct {
		s   string
		ans int
	}{
		// Normal cases
		{"abcabcbb", 3},
		{"pwwkew", 3},

		// Edge cases
		{"0", 1},
		{"b", 1},
		{"bbbbbbbbbb", 1},
		{"abcabcabcd", 4},

		// chinese support
		{"這裏是慕課網", 6},
		{"一二三二一", 3},
		{"黑化肥揮發發灰會花飛灰化肥揮發發黑會飛花", 8},
	}

	for _, tt := range tests {
		if actual := lengthOfNonRepeatingSubStr(tt.s); actual != tt.ans {
			t.Errorf("got %d for input %s;"+"expected %d", actual, tt.s, tt.ans)
		}
	}

}

// 性能測試 map runtime
func BenchmarkSubstr(b *testing.B) {
	s := "黑化肥揮發發灰會花飛灰化肥揮發發黑會飛花"
	ans := 8

	for i := 0; i < b.N; i++ {
		if actual := lengthOfNonRepeatingSubStr(s); actual != ans {
			b.Errorf("got %d for input %s;"+"expected %d", actual, s, ans)
		}
	}

}
package main

import (
	"errors"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"os"
	"strings"
	"testing"
)

/*
	http測試
	1.通過使用假的Request/Response   單元測試
	2.通過起服務器

*/

func errPanic(writer http.ResponseWriter, request *http.Request) error {
	panic(123)
}

type testingUserError string

func (e testingUserError) Error() string {
	return e.Message()
}

func (e testingUserError) Message() string {
	return string(e)
}

func errUserError(writer http.ResponseWriter, request *http.Request) error {
	return testingUserError("user error")
}

func errNotFound(writer http.ResponseWriter, request *http.Request) error {
	return os.ErrNotExist
}

func errNoPermission(writer http.ResponseWriter, request *http.Request) error {
	return os.ErrPermission
}

func errUnknown(writer http.ResponseWriter, request *http.Request) error {
	return errors.New("unknown error")
}

func noError(writer http.ResponseWriter, request *http.Request) error {
	fmt.Fprintln(writer, "no error")
	return nil
}

var tests = []struct {
	h       appHandler
	code    int
	message string
}{
	{errPanic, 500, "Internal Server Error"},
	{errUserError, 400, "user error"},
	{errNotFound, 404, "Not Found"},
	{errNoPermission, 403, "Forbidden"},
	{errUnknown, 500, "Internal Server Error"},
	{noError, 200, "no error"},
}

func verifyResponse(resp *http.Response, expectedCode int, expectedMsg string, t *testing.T) {
	b, _ := ioutil.ReadAll(resp.Body)
	body := strings.Trim(string(b), "\n")
	if resp.StatusCode != expectedCode || body != expectedMsg {
		t.Errorf("expect (%d, %s); "+"got(%d, %s)", expectedCode, expectedMsg, resp.StatusCode, body)
	}
}

func TestErrWrapper(t *testing.T) {

	for _, tt := range tests {
		f := errWrapper(tt.h)
		response := httptest.NewRecorder()
		request := httptest.NewRequest(
			http.MethodGet,
			"http://www.imooc.com", nil)

		f(response, request)
		verifyResponse(response.Result(), tt.code, tt.message, t)

	}
}

func TestErrWrapperInServer(t *testing.T) {
	for _, tt := range tests {
		f := errWrapper(tt.h)
		server := httptest.NewServer(http.HandlerFunc(f))
		resp, _ := http.Get(server.URL)
		verifyResponse(resp, tt.code, tt.message, t)
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章