白盒用例測試程式 go實現

2021-10-01 22:10:04 字數 4774 閱讀 5936

簡單介紹一下白盒測試:

原始碼公開,清楚傳參、返回值和處理邏輯;

我們在測試乙個方法或者介面時,通過傳入合法或者非法的引數,並且抽選一些具有代表性的值作為測試用的合法傳參,通過模仿正常請求,檢測方法或介面內部的異常。

週末沒事,又想學習一下go,最近又老寫bug,所以就想到用go寫乙個測試程序,實現白盒`用例`測試

用到的資料結構簡單介紹一哈:

用clinet表示乙個正常的客服端, clientpool是乙個client連線池,復用客戶端與服務端的套介面連線(即在http請求頭中包含 `connection: keepalive`),減少了埠的開銷,就可以實現100w的請求量;由於是在本地開啟的服務端和客戶端,如果使用短連線的話,將會有許多套介面處於`time_wait`狀態,多到再無可用埠,客戶端(如將`maxconnsperhost`置為小於0的數值,當一次請求完成後,客服端就會主動關閉套介面)和服務端(如將`disablekeepalive` 為 false ,那麼一定時間內客服端都沒有傳送訊息給服務端,服務端將會主動關閉套介面;而將`disablekeepalive` 為 true的話,服務端也會在http請求應答傳送完畢後,主動關閉連線)的正常連線會受到影響從而影響了測試(主動關閉的套介面狀態會轉為`time_wait`,一般情況下,在`2ml時間內`,該套介面繫結的埠就暫不可用),所以為了不影響測試而復用socket套介面。

在net/http的實現中,只有當真正傳送了http請求(因為傳送http請求時才會給出 `host`)才會連線服務端,如果連線池中有可復用(同一`host`下)的連線則會復用連線;

`測試用例` 所用的資料結構:

//包裝了請求的response的body和code,並記錄了用時

type response struct

//一次測試的資料統計

type td struct

//乙個測試用例,程序中並沒有處理傳參的具體型別,只是json_decode又json_encode而已

type tinput struct `json:params`

}//解析輸入測試檔案, 解析輸出結果

type tg struct

`客服端` 所用的資料結構

//簡單封裝了 http.client

type client struct

//client連線池

type clientpool struct

完整程式:

)//建立乙個client,獲取乙個client,銷毀乙個client,對client集合進行迭代

type clientconfig struct

//簡單封裝了 http.client

type client struct

//client連線池

type clientpool struct

//創造乙個client

}//獲取乙個client, err暫時為nil, ok暫時為true

func (cp *clientpool) get() (client *client, err error) )

client := &nc

return client, err

}return

}//建立乙個新的client客服端連線池

func newclientpool(maxidleconn, connsizeperhost int, disablekeepalive bool, clientcnt int) *clientpool

freeclientque := make(client,0, clientcnt)

for i := 0; i < clientcnt; i++

return &clientpool

}func (cp *clientpool) pop() (client *client, ok bool) }}

return

}//對client集合進行**

func (cp *clientpool) gc()

//刪除client

//測試樣例

type tinput struct `json:params`

}//解析輸入測試檔案, 解析輸出結果

type tg struct

//解析測試用例

func readcase(filename string) (tg *tg, err error)

defer file.close()

content, err := ioutil.readall(file)

if err != nil

tg = &tg

err = json.unmarshal(content, tg)

if err != nil

return

}//主流程

func process(filename string) (td *td, err error)

cp := newclientpool(48, 2, false, 24)

wg := sync.waitgroup{}

gwg := sync.waitgroup{}

td = &td

work := func(client *client, td *td, post byte)

ts := time.now()

//避免併發競爭下引起的阻塞, 而導致程序一直阻塞

select

if err != nil

cost := time.since(ts).milliseconds()

cod := request_succ

//存在`併發競爭`情況, 一般情況下, 請求成功的概率高於失敗, 所以只統計失敗次數, 而成功次數由請求總數-失敗次數

retbody, err := ioutil.readall(resp.body)

mutex.lock()

if err != nil || resp.statuscode != 200 || string(retbody) != td.tg.ret

mutex.unlock()

ret := response

wg.add(-1)

gwg.add(-1)

}ts := time.now()

var j = 0

for i := 0; i < tg.cnt; i++

for ca := range tg.list

jsondata, err := json.marshal(ca)

if err != nil

gwg.add(1)

wg.add(1)

go work(client, td, jsondata)}}

wg.wait()

te := time.since(ts)

td.succ = td.tg.cnt - td.fail

td.cost = te

return

}測試demo:

}測試用例檔案

}]}

程式效率計算:

1w請求, 用時在1s左右, 通過率99.99%

10w請求,用時在10s左右, 通過率99.99%

100w請求,用時在1m30s左右, 通過率99.99%(想用100%來表示的...)

開發途中遇到協程的數量過多而導致鎖爭用超時和死鎖等問題。

白盒測試用例設計

檢查設計和 靜態測試是指測試非執行部分 檢查和審查。白盒測試是指訪問 能夠檢視和審查。靜態白盒測試實在不執行的條件下有條理地仔細審查軟體設計 體系結構和 從而找出軟體缺陷的過程。有時也稱為結構分析。進行靜態白盒子測試的首要原因就是盡早發現軟體缺陷,以找出動態黑盒子測試難以揭示或遇到的軟體缺陷 另乙個...

白盒測試用例設計

1.1.1.1 靜態白盒測試 評審 檢查 1.1.1.2 動態白盒測試 邏輯覆蓋 基本路徑覆蓋 迴圈覆蓋 1.1.2.1 檢查方式 桌面檢查 審查 走查1.1.2.2 檢查專案 變數的交叉引用表 標號的交叉引用表 子程式 巨集 函式 等價性檢查 常量檢查 標準檢查 風格檢查 對照程式的規格說明,詳細...

原創 白盒測試用例設計方法

原創 白盒測試用例設計方法 白盒測試用例設計方法主要分為邏輯覆蓋測試和基本路徑測試.其中邏輯覆蓋包括 語句覆蓋 判定覆蓋 條件覆蓋 判定條件覆蓋 條件組合覆蓋 路徑覆蓋,具體見下所示 語句覆蓋就是設計若干個測試用例,執行被測程式,使得每一可執行語句至少執行一次。判定覆蓋就是設計若干個測試用例,執行被...