- 測試驅動開發:入門、實戰與進階
- (美)薩利姆·西迪基
- 1742字
- 2024-04-12 19:15:16
1.3 第一個失敗的測試
我們先來做清單里的第一個功能:

首先,編寫一個失敗的測試,這就是RGR環中的第一個環節:紅。
1.3.1 Go
在go文件夾里新建一個名叫money_test.go的文件,然后我們就來編寫第一個測試:



?包聲明。
?引入testing包,后面的t.Errorf需要用到這個包。
?這是我們的測試方法,該方法必須以Test開頭,并擁有一個*testing.T型的參數。
?這是個用來表示“USD 5”(5美元)的結構體,目前還不存在Dollar結構體。
?調用有待接受測試的方法,也就是Times方法,該方法目前并不存在。
?將實際值與我們所期望的值相對比。
?確保該測試會在期望值與實際值不符時失敗。
這個測試函數包含許多為了做測試而必須要寫的樣板代碼。
package main這樣一條聲明用來表示其后的所有代碼都是main包的一部分。如果想編寫可單獨執行的Go程序,那么必須這樣做。包管理(https://oreil.ly/yvh3S)是Go語言中一個較為復雜的功能。我們會在第5章詳細討論。
接下來,我們用import語句引入testing包。后面的單元測試需要使用該包。
單元測試函數(即TestMultiplication函數)是這段代碼的主要內容。我們在該函數中聲明了一個實體,用來表示“USD 5”。我們還創建了一個名叫fiver的變量,并把這個amount字段為5的結構體設為該變量的初始值(或者說,我們用這個amount字段為5的結構體來初始化該變量)。然后,我們將fiver與2相乘〔并用變量tenner來表示結果〕。我們希望相乘的結果是10美元,也就是說,tenner變量的amount字段必定等于10。如果不是這樣,就打印一條格式整齊的錯誤消息,以顯示實際的值(無論這個值是多少,我們都把它寫在這條消息之中)。
我們在TDD Project Root文件夾中用go test-v .命令運行測試,大家應該會看到下面這樣的錯誤:

這條信息說得很明白:我們寫的測試失?。‵AIL)了。到這里,我們就完成了TDD的第一步,也就是寫一個失敗的測試。
go test-v.命令用來運行當前文件夾中的測試,go test-v ./...命令[1]用來運行當前文件夾與各個子文件夾中的測試。-v選項(或者說開關)的意思是,打印詳盡的輸出信息。
1.3.2 JavaScript
在js文件夾中新建名叫test_money.js的文件,然后開始編寫我們的第一個測試用例:


?引入assert包,稍后的斷言語句需要用到這個包。
?創建一個表示“USD 5”的對象。目前還不存在這種Dollar對象。
?調用有待接受測試的方法,也就是times方法。該方法目前并不存在。
?通過strictEqual斷言語句來對比實際值與我們所期望的值。
用JavaScript語言做測試時,幾乎沒有那種為了做測試而必須編寫的樣板代碼,我們只需要用一行require語句把名為assert的NPM包引入就行了。
這行代碼之后的三行代碼是用來做測試的。我們創建一個表示5美元的對象,將其乘以2,并期望相乘的結果是10。
ES2015新增了用來聲明變量的let關鍵字(https://oreil.ly/jBMPk)與用來聲明常量的const關鍵字(https://oreil.ly/GfYQ5)。
我們在TDD Project Root目錄下用node js/test_money.js運行測試,會看到像如下這樣開頭的一段錯誤信息:

太棒了!我們已經寫好了第一個失敗的測試用例。
node file.js這樣的命令用來運行名為file.js的JavaScript代碼文件并輸出運行結果。我們在本書中也采用這種格式的命令來運行測試。
1.3.3 Python
在py文件夾中新建名為test_money.py的文件,并開始編寫我們的首個測試:


?引入unittest包,后面要寫的TestMoney類需要以該包中的TestCase類為超類。
?這是我們自己的測試類,該類必須是unittest.TestCase類的子類。
?測試方法的名稱必須以test開頭。
?這是個用來表示“USD 5”(5美元)的對象。當前還不存在這種Dollar對象。
?調用有待接受測試的times方法,該方法目前并不存在。
?用assertEqual語句對比期望值與實際值。
?按慣例編寫__main__結構,以確保這個TestMoney類〔所在的test_money.py文件〕能夠單獨作為一個腳本運行。
為了用Python語言做測試,我們必須通過import關鍵字引入unittest包,并創建一個TestCase類的子類,還需要定義一個名稱以test開頭的函數。另外,為了讓我們的測試類〔所在的test_money.py文件〕可以作為單獨的程序運行,需要按照Python的慣例書寫__main__結構(參見https://docs.python.org/3/library/__main__.html),以便在單獨運行〔而不是作為其他腳本的一部分來運行〕test_money.py時,能夠觸發unittest.main()函數〔以啟動測試〕。
這個測試函數(即testMultiplication函數)描繪我們期望代碼如何運作。我們定義名為fiver的變量,并將其初始化為一個我們想要的對象,該對象應是Dollar類的實例(當然,目前這個類還不存在)。我們構造該對象時,向構造器傳入5作為參數。然后,我們把fiver與2相乘,并將結果保存在tenner變量中。最后,我們期望tenner的amount應該是10。
我們在TDD_PROJECT_ROOT文件夾中,用python3 py/test_money.py-v命令運行這段代碼時,會看到含有下列信息的錯誤:

好,我們已經把第一個失敗的測試給寫出來了!
python3 file.py-v格式的命令用來運行名為file.py的Python代碼。-v的意思是顯示詳盡的輸出信息。我們會采用這種格式的命令來運行本書的測試。
- Spring Cloud Alibaba核心技術與實戰案例
- OpenDaylight Cookbook
- JavaScript語言精髓與編程實踐(第3版)
- Visual Basic程序設計教程
- PyTorch Artificial Intelligence Fundamentals
- Backbone.js Blueprints
- SQL基礎教程(視頻教學版)
- Learning SciPy for Numerical and Scientific Computing(Second Edition)
- RabbitMQ Essentials
- Bootstrap 4 Cookbook
- Laravel Application Development Blueprints
- Python自然語言理解:自然語言理解系統開發與應用實戰
- Getting Started with RethinkDB
- 城市信息模型平臺頂層設計與實踐
- Java核心技術速學版(第3版)