官术网_书友最值得收藏!

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的意思是顯示詳盡的輸出信息。我們會采用這種格式的命令來運行本書的測試。

主站蜘蛛池模板: 鄄城县| 思南县| 监利县| 永年县| 芜湖市| 南川市| 青海省| 保康县| 卓尼县| 尉氏县| 来安县| 津南区| 新泰市| 赤城县| 磐安县| 北流市| 盐山县| 新巴尔虎右旗| 德阳市| 达日县| 张北县| 剑阁县| 丰台区| 襄汾县| 林甸县| 栾城县| 广灵县| 乌拉特后旗| 彭山县| 黎平县| 神农架林区| 宁海县| 修武县| 天门市| 布尔津县| 神池县| 南充市| 石景山区| 石城县| 孙吴县| 西充县|