This commit is contained in:
chai2010
2015-12-16 10:55:14 +08:00
parent 3e80d25c15
commit c187ed90f8
6 changed files with 60 additions and 41 deletions

View File

@@ -1,9 +1,9 @@
### 11.2.2. 測試一個命令
对于测试`go test` 是一的有用的工具, 但是稍加努力我也可以用它来测试可执行程序. 如果一包的名字是 main, 那么在构建时会生成一个可执行程序, 不 main 包可以作为一个包被测试器代码导入.
對於測試`go test` 是一的有用的工具, 但是稍加努力我也可以用它來測試可執行程序. 如果一包的名字是 main, 那麽在構建時會生成一個可執行程序, 不 main 包可以作為一個包被測試器代碼導入.
让我们为 2.3.2 的 echo 程序编写一个测试. 我们先将程序拆分为两个函数: echo 函完成正的工作, main 函数用于处理命令行输入参数和echo可能返回的错误.
讓我們為 2.3.2 的 echo 程序編寫一個測試. 我們先將程序拆分為兩個函數: echo 函完成正的工作, main 函數用於處理命令行輸入參數和echo可能返迴的錯誤.
```Go
gopl.io/ch11/echo
@@ -42,7 +42,7 @@ func echo(newline bool, sep string, args []string) error {
}
```
测试中吗我们可以用各种参数和标标志调用 echo 函, 然后检测它的输出是否正, 我们通过增加参数来减少 echo 函数对全局变量的依. 我们还增加了一个全局名为 out 的变量来替代直接使用 os.Stdout, 这样测试代码可以根需要 out 修改为不同的对象以便于检查. 下就是 echo_test.go 文件中的测试代码:
測試中嗎我們可以用各種參數和標標誌調用 echo 函, 然後檢測它的輸齣是否正, 我們通過增加參數來減少 echo 函數對全侷變量的依. 我們還增加了一個全侷名為 out 的變量來替代直接使用 os.Stdout, 這樣測試代碼可以根需要 out 脩改為不衕的對象以便於檢査. 下就是 echo_test.go 文件中的測試代碼:
```Go
package main
@@ -83,15 +83,15 @@ func TestEcho(t *testing.T) {
}
```
意的是测试代码和产品代码在同一个包. 然是main包, 也有对应的 main 入口函, 但是在测试的时候 main 包是 TestEcho 测试函数导入的一普通包, 里面 main 函数并没有被导出是被忽略的.
意的是測試代碼和產品代碼在衕一個包. 然是main包, 也有對應的 main 入口函, 但是在測試的時候 main 包是 TestEcho 測試函數導入的一普通包, 裡麪 main 函數並沒有被導齣是被忽略的.
过将测试放到格中, 我很容易添加新的测试用例. 我通增加下面的测试用例看看失的情是怎么样的:
過將測試放到格中, 我很容易添加新的測試用例. 我通增加下麪的測試用例看看失的情是怎麽樣的:
```Go
{true, ",", []string{"a", "b", "c"}, "a b c\n"}, // NOTE: wrong expectation!
```
`go test` 输出如下:
`go test` 輸齣如下:
```
$ go test gopl.io/ch11/echo
@@ -101,8 +101,8 @@ FAIL
FAIL gopl.io/ch11/echo 0.006s
```
错误信息描述了尝试的操作(使用Go类似语法), 实际的行, 和期望的行. 通过这样的错误信息, 你可以在检视代码之前就很容易定位错误的原因.
錯誤信息描述了嘗試的操作(使用Go類似語法), 實際的行, 和期望的行. 通過這樣的錯誤信息, 你可以在檢視代碼之前就很容易定位錯誤的原因.
意的是在测试代码中并没有调用 log.Fatal 或 os.Exit, 因为调用这类函数会导致程序提前退; 调用这些函的特权应该放在 main 函中. 如果的有以外的事情导致函数发送 panic, 测试驱动应该尝试 recover, 然后将当前测试当作失败处理. 如果是可期的错误, 例如非法的用户输入, 找不到文件, 或配置文件不当等应该通过返回一个非空的 error 的方式理. 幸运的是(上的意外是一个插曲), 我的 echo 示例是比较简单的也有需要返非空error的情.
意的是在測試代碼中並沒有調用 log.Fatal 或 os.Exit, 因為調用這類函數會導緻程序提前退; 調用這些函的特權應該放在 main 函中. 如果的有以外的事情導緻函數發送 panic, 測試驅動應該嘗試 recover, 然後將噹前測試噹作失敗處理. 如果是可期的錯誤, 例如非法的用戶輸入, 找不到文件, 或配置文件不噹等應該通過返迴一個非空的 error 的方式理. 倖運的是(上的意外是一個插麯), 我的 echo 示例是比較簡單的也有需要返非空error的情.