Gol語言測試理念和工具

2020-12-05 蟲蟲搜奇

Golang語言是現在炙手可熱的程式語言之一。每個人可能都或多或少的學習和用Golang在寫東西。在程序開發中,測試是一個中必不可少的部分。

有句話"工欲善其事,必先利其器",測試就是開發中值得花功夫"磨快刀"的開發利器。本文我們就一起來學習下如何在Golang測試理念及測試工具。

概述

Golang中附帶了用於編寫和運行測試工具:標準庫testing包以go test命令行工具運行測試套件。和Golang語言本身的設計理念一致,Golang測試理念很簡單:用輕量級的測試包和Golang幫助函數結合實現。在這樣的理念下測試也是代碼。由於Golang開發人員已經知道如何使用抽象和類型編寫Go,因此無需在額外學習特定的測試語法沒個人可能都或多或少和配置。看下面一個簡單的實例,用testing 測試Abs函數簡單代碼:

func TestAbs(t *testing.T) {

got := Abs(-1)

if got != 1 {

t.Errorf("Abs(-1) = %d; want 1", got)

}

}

與上面的代碼對比,下面是使用Ginkgo庫編寫的例子。Ginkg庫為Golang提供了編寫RSpec風格的測試方法:

Describe("Abs", func() {

It("returns correct abs value for -1", func() {

got := Abs(-1)

Expect(got).To(Equal(1))

})

})

兩種表達方式,顯然第一種方法對Golang碼農來說,更加易於理解。RSpec風格中使用諸如函數Describe,Expect的語法模仿了人類語言的表達體驗。但是但是對golang碼農來說,這來的可能會很突兀,需要重新學習和適應。

另一個相對輕量級的庫是testify/assert,它添加了諸如assert.Equal()之類的通用斷言函數。

testify/suite則添加了諸如setup和teardown之類的測試套件實用工具。

"Awesome Go"網站提供了此類第三方軟體包的詳盡列表。

還一個不包含在測試包中的有用的測試工具是reflect.DeepEqual(),這是一個標準庫函數,它用反射來測試深度相等性,即跟隨指針並遞歸到映射,數組等之後的相等性。當測試比較JSON對象或帶有指針的結構之類的東西時,該函數非常有用。以此為基礎的兩個庫是谷歌的go-cmp軟體包和Daniel Nichter的deep,它們類似於DeepEqual,但是格式規範為,更加適應人類閱讀的方式。例如,下面使用go-cmp對MakeUsers()函數進行的測試:

其輸出更加人性化:

內置測試功能

Golang內置的testing包攜帶了各種功能,可記錄信息和報告故障,在運行時跳過測試或僅以簡短模式運行測試。簡短模式提供了一種跳過長時間運行或具有大量設置的測試的方法,這在開發過程中可能會有所幫助。可以用-test.short命令行參數啟用它。

Go的測試運行程序默認情況下按順序執行測試,但提供一個可選的Parallel()函數允許跨多個內核同時運行帶有顯著標記的測試。

在Go 1.14中,測試包添加了Cleanup()函數,該函數註冊了一個在測試完成時要調用的函數。

這是一種簡化拆卸的內置方法,例如,在測試完成後刪除資料庫表:

Go 1.15添加了一個測試助手TempDir(),該助手為當前測試創建(並清理)了一個臨時目錄。

表驅動測試

Golang中常見的習慣用法是在測試各種邊緣情況時避免重複,稱為"表驅動測試"。該技術迭代"切片"中的測試用例,報告每次迭代的失敗:

該t.Errorf()的調用提示存在的問題,但不會停止測試的執行,所以可以報告多個問題。在標準庫測試(例如fmt測試)中,這種表驅動測試的樣式很常見。Golang 1.7引入了一個功能Subtests,它讓運行在命令行中單獨進行部分子測試,可以更好的控制在失敗和平行執行。

模擬和接口

Go的著名語言功能之一是其結構類型化的接口,也被稱為"編譯時鴨子類型 ="。每當需要在運行時改變行為時,接口就很重要,當然其中包括測試。

例如,正如Golang核心開發者Andrew Gerrand在2014年"測試技術"演講的所舉過的例子:文件格式解析器不應像這樣傳遞具體的文件類型:

func Parse(f *os.File) error { ... }

而,Parse()應該僅採用一個僅實現所需功能的小型接口。在這種情況下,無處不在的io.Reader是一個不錯的選擇:

func Parse(r io.Reader) error { ... }

這樣,就可以向解析器提供任何能實現io.Reader的東西,包括文件,字符串緩衝區和網絡連接等。它還使測試變得更加容易(可能使用strings.Reader)。

如果測試僅使用大型接口的一小部分,例如來自多個方法API的一種方法,則可以創建一種新的結構類型,該結構類型嵌入接口以實現API合同,並且僅覆蓋被調用的方法。。

有各種第三方工具,例如GoMock和mockery,可以從接口定義自動生成模仿代碼。

測試用例

Go的軟體包文檔是從原始碼中的注釋生成的。與Javadoc或C#的文檔系統在代碼注釋中大量使用標記不同,Golang的方法是,原始碼中的注釋仍應在原始碼中可讀,而不不是滿篇幅的標記。

它採用與文檔示例類似的方法:下面是可運行的代碼片段,這些片段在運行測試時自動執行,然後包含在生成的文檔中。就像Python的doctests一樣,測試用例將寫入標準輸出,並將輸出和期待的輸出進行比較,避免文檔示例中的回歸。這是一個Abs()函數的測試用例:

func ExampleAbs() {

fmt.Println(Abs(15))

fmt.Println(Abs(-24))

// Output:

// 15

// 24

}

示例函數必須位於*_test.go文件中,並添加Example前綴。當測試運行程序執行時,會自動解析Output:注釋並將其與實際輸出進行比較,如果它們不同,則測試失敗。這些示例作為可運行的Go Playground代碼段包含在生成的文檔中,

基準測試

除測試外,該測試包還允許運行定時基準測試。這些在整個標準庫中大量使用,以確保執行速度不下降。可以使用帶有-bench =選項的go test自動運行基準測試。

例如,下面標準庫的strings.TrimSpace()函數的基準測試用例:

在測試工具將報表中的數字;諸如Benchstat之類的程序可用於比較之前和之後的時間。Benchstat的輸出通常包含在Go的提交消息中,這些消息顯示了性能的提高。

報告顯示,儘管"SomeNonASCII"子測試的速度降低了約9%,但TrimSpace的ASCII快速路徑使純ASCII輸入的速度提高了約5倍。

要診斷某些地方運行緩慢,可以使用內置的profiling性能分析工具,例如運行測試時的-cpuprofile選項。內置的工具pprof以多種格式顯示性能結果,包括火焰圖。

go test命令

社區中對Golang對測試目錄測試用例(在名為*_test.go的文件中)以及測試函數的命名方式(必須有Test前綴)很有意見。但是,go test工具確實一個很好用的工具,它可以確切地知道去哪裡查找並運行測試用例。不需要額外的用於描述測試存放位置makefile或元數據。如果文件和函數是以標準方式命名的,其他的go test就可以自動搞定。go test命令表面很簡單,但是其選項不少也很繁瑣:

go test:在當前目錄中運行測試

go test package:對給定的包運行測試

go test ./...:對當前目錄和所有子包運行測試

go test -run=foo:運行與正則表達式"foo"匹配的測試

go test -cover:運行測試並輸出代碼覆蓋率

go test -bench=.:#同時運行基準

go test -bench=. -cpuprofile cpu.out:運行基準測試,記錄性能分析信息

go test的 -cover模式會生成代碼覆蓋率配置文件,可以使用go tool cover -html = coverage.out將轉為html格式。

總結

Go的測試庫簡單方便,而且可擴展,go test命令行工具進行測試執行,並進行結果處理、基準測試、性能分析和代碼覆蓋率等分析。go testing包中乾貨滿滿,需要我們長時間去探索。當然golang也不排除第三測試模塊,獲取更多的測試體驗,當然你也可以開發適合自己的測試模塊,所有這些在Golang都是可能。

相關焦點

  • 軟體測試工具有哪些?10款常見的軟體測試工具推薦
    軟體測試工具分為自動化軟體測試工具和測試管理工具。自動化軟體測試工具存在的價值是為了提高測試效率,用軟體來代替一些人工輸入。測試管理工具是為了復用測試用例,提高軟體測試的價值。一個好的軟體測試工具和測試管理工具結合起來使用將會使軟體測試效率大大的提高。那麼軟體測試工具有哪些呢?
  • 常用軟體性能測試工具
    【IT168技術資訊】  目前市場上的性能測試的工具種類很多,可以簡單的劃分為以下幾種:負載壓力測試工具、資源監控工具、故障定位工具以及調優工具。  1.主流負載性能測試工具  負載性能測試工具的原理通常是通過錄製、回放腳本、模擬多用戶同時訪問被測試系統,製造負載,產生並記錄各種性能指標,生成分析結果,從而完成性能測試的任務。  主流的負載性能測試工具有:  QA Load:Compuware公司的QALoad是客戶/伺服器系統、企業資源配置(ERP)和電子商務應用的自動化負載測試工具。
  • 推薦14款開源的Web應用測試工具
    1.JMeter是Apache組織的開放原始碼項目,它是功能和性能測試的工具,100%的用java實現。2.GrinderGrinder是一個負載測試框架,通過Jython來編寫測試腳本,基於HTTP的測試可以由瀏覽器來記錄整個要測試的過程。
  • 數據科學家常用的10種程式語言和工具
    首先你要對數據科學家這份工作做一個研究,例如數據科學家需要掌握哪些數據科學工具和程式語言?一般來說,R和Python是需要重點掌握的。如果你已經掌握了一些程式語言,那麼你就應該關注一些流行的工具。  數據分析和數據科學家是一個很好的職業發展方向。職業網站Glassdoor將數據科學家評為2016美國最好的工作。據悉,數據科學家的平均年薪為116840美元,目前有很大的市場需求。
  • Speedtest for mac(網速測試工具)
    Ookla Speedtest 是一款 Mac 網速測試工具。可以幫助您進行 30 秒上傳速度測試及下載速度測試。Speedtest 設計美觀,使用簡單,全球分布的網絡可以讓您在任何地方測速都變得既方便又準確。
  • QNET網絡測試工具2.0全新發布
    弱網絡測試背景 為什麼要進行網絡測試? (1)驗證應用/遊戲在不同網絡場景下表現是否符合預期,會不會觸發未知的系統bug; (2)提高不同網絡場景下的用戶體驗; (3)測試公用組件/SDK在不同網絡狀態下的穩定性。 目前在測試行動裝置上進行弱網絡專項測試的方案有哪些?
  • Google宣布推出AutoML Vision,自然語言,翻譯和聯絡中心AI
    從本周開始,AutoML Vision是一種圖形拖放工具,可讓用戶利用Google的雲計算後端來訓練自學習對象識別和圖像檢測模型,該工具正在退出alpha並進入公共測試階段。谷歌透露,自1月以來,約有18,000名客戶表示對AutoML Vision感興趣。
  • 12 種自然語言處理的開源工具
    儘管我並不熟悉所有工具,但我將從我所熟悉的程式語言出發來介紹這些工具(對於我不熟悉的語言,我無法找到大量的工具)。也就是說,出於各種原因,我排除了三種我熟悉的語言之外的工具。R 語言可能是沒有被包含在內的最重要的語言,因為我發現的大多數庫都有一年多沒有更新了。這並不一定意味著它們沒有得到很好的維護,但我認為它們應該得到更多的更新,以便和同一領域的其他工具競爭。
  • 斯坦福發布重磅NLP工具包StanfordNLP,支持中文等53種語言
    新智元報導 來源:stanfordnlp.github.io編輯:肖琴【新智元導讀】斯坦福團隊最新發布一個NLP任務的軟體包StanfordNLP,通過Python接口為53種語言提供標記、依存句法分析等NLP任務的重要工具
  • API 測試工具 Hitchhiker v0.7,Schedule 的對比 diff
    支持以diff方式查看Schedule的對比結果Hitchhiker的Schedule是支持不同環境的數據對比的,不過之前只是把兩邊的response和對比結果給出來,想要知道有哪些不同的話還需要藉助其他diff工具來對比,比較麻煩。
  • 網絡安全測試必備工具
    網絡安全技術包括了廣泛的內容,從網絡體系架構的設計到安全控制的管理,都涉及多方面的技術和手段。部署網絡安全設備,進行網絡邏輯隔離,或者進行身份認證,遠程登錄,安全配置等操作,都是被動的防禦,所謂授之於魚不如授之以漁,了解常見的網絡安全測試工具,從被動變為主動,主動的查漏補缺,防患於未然。
  • 7個用於開源網絡情報滲透測試工作的熱門OSINT工具
    這些設備可能與筆記本電腦,交通信號燈,計算機和各種其他IoT設備不同。該OSINT開源網絡情報工具主要幫助安全分析人員確定目標並針對不同的漏洞,密碼,服務,埠等進行測試。此外,它為用戶提供了靈活的搜索選項。例如,讓單個用戶可以看到已連接的網絡攝像機,網絡攝像頭,交通信號燈等的情況。
  • PH測試工具對比
    其中PH值在很多大神眼裡是非常重要的一個數值,特別那些養龜和虹魚的,PH變化個0.5就跳起來了。雖然我已經寫過幾篇文章解說PH值與水質的關係。但很多魚友還是覺得我應該緊張一些。說到這PH值,測試方式也是一個問題點。如果測試出來的數值不準,這樣會引起非常多的麻煩。會讓一些過份緊張PH值變化的魚友瘋狂起來。市面上測試PH的工具可分大三類,試紙類,試劑類,電子測試等。
  • 20個免費的在線測試工具:測試網站速度
    【IT168 技術】導讀:本文將介紹20個網站速度的測試工具。網頁性能很大程度上決定了用戶體驗,最終可以決定網站的成功。雖然我們都知道提高瀏覽速度的重要性,可是很多時候我們不知道什么元素拖了後腿。這裡將介紹的工具可以幫助你確定網頁上的速度瓶頸,從而能夠讓你找到問題,進而解決問題,設計出高效的網站。
  • 泳池餘氯測試的工具與方法?
    ,從而確定如何加藥,所以,餘氯測試是我們每日需要做的工作,並且每天都要做幾次的工作,那麼,餘氯測試的工具有哪些呢,方法有哪些呢,下面我們一一介紹。餘氯測試的工具:1、百靈達水質檢測系列:百靈達水質檢測儀(Pooltest25)、百靈達水質檢測儀Pooltest6、百靈達水質檢測儀(Pooltest9)、百靈達水質檢測儀(CoolPooltester3)。
  • Web 設計和開發工具指南
    它由標準化的用戶界面工具包和面向數據的組件組成。3. Brackets類型: 免費一個 HTML, JavaScript 和 CSS 的開原始碼編輯器。 這個工具是為每個在編程時避免雜亂的人準備的。Adobe Dreamweaver類型: 付費(就像所有的 Adobe 工具一樣, 這是一個軟體, 你可以每個月訂閱他們的計劃)。Adobe Dreamweaver 是為各個階段的網站和各種技能級別的 web 開發者設計的工具。 從直觀的代碼編輯功能到實時視圖, 它給你各種選項來設計和編輯你的網站。
  • 超強大自動NLP工具!谷歌推出AutoML自然語言預訓練模型
    今年早些時候,谷歌發布了AutoML自然語言(AutoML Natural Language),這是其Cloud AutoML機器學習平臺向自然語言處理領域的擴展。 經過數月的beta測試,谷歌近日宣布面向全球用戶推出AutoML Natural Language的通用版本,支持分類、情緒分析和實體提取等任務,以及支持各種文件格式,包括掃描的pdf文件。 AutoML自然語言利用機器學習來揭示電子郵件、聊天日誌、社交媒體帖子等文本的結構和含義。
  • Android壓力測試Monkey工具
    最近在Android程序測試過程中接觸到了自動化測試方法,對其中的一些工具、方法和框架做了一些簡單的整理,其中包括android測試框架、CTS、Monkey、Monkeyrunner其它test tool等等。因接觸時間很短,很多地方有不足之處,希望能和大家多多交流和指點在這裡簡單對monkey做簡單的介紹吧。
  • 測試後精選的6個標題生成和分析工具推薦!
    公眾號:運營有道理,跨境電商工具、國外SaaS介紹。
  • Futuremark推電池測試工具Powermark
    Futuremark推電池測試工具Powermark 2011年12月16日 00:52作者:Futuremark編輯:張偉(編輯)文章出處:泡泡網原創