update tw

This commit is contained in:
chai2010
2015-12-18 10:53:03 +08:00
parent 510c741a6f
commit c66a96ee52
106 changed files with 864 additions and 864 deletions

View File

@@ -1,20 +1,20 @@
### 11.2.4. 擴展測試包
考慮下這兩個包: net/url 包, 提供了 URL 解析的功能; net/http 包, 提供了web服務和HTTP客戶端的功能. 如我們所料, 上層的 net/http 包依賴下層的 net/url 包. 然後, net/url 包中的一個測試是演示不URL和HTTP客戶端的交互行. 也就是, 一個下層包的測試代碼導入了上層的包.
考慮下這兩個包: net/url 包, 提供了 URL 解析的功能; net/http 包, 提供了web服務和HTTP客戶端的功能. 如我們所料, 上層的 net/http 包依賴下層的 net/url 包. 然後, net/url 包中的一個測試是演示不URL和HTTP客戶端的交互行. 也就是, 一個下層包的測試代碼導入了上層的包.
![](../images/ch11-01.png)
這樣的行在 net/url 包的測試代碼中會導緻包的循環依賴, 正如 圖11.1中上箭頭所示, 時正如我們在 10.1節所, Go語言規範是禁止包的循環依賴的.
這樣的行在 net/url 包的測試代碼中會導緻包的循環依賴, 正如 圖11.1中上箭頭所示, 時正如我們在 10.1節所, Go語言規範是禁止包的循環依賴的.
我們可以通過測試擴展包的方式解決循環依賴的問題, 也就是在 net/url 包所在的目録聲明一個 url_test 測試擴展包. 其中測試擴展包名的 `_test` 後綴告訴 go test 工具它應該建立一個額外的包來運行測試. 我們將這個擴展測試包的導入路徑視作是 net/url_test 會更容易理解, 但實際上它並不能被其他任何包導入.
測試擴展包是一個獨立的包, 因此可以導入測試代碼依賴的其他的輔助包; 包內的測試代碼可能無法做到. 在設計層, 測試擴展包是在所以它依賴的包的上層, 正如 圖11.2所示.
測試擴展包是一個獨立的包, 因此可以導入測試代碼依賴的其他的輔助包; 包內的測試代碼可能無法做到. 在設計層, 測試擴展包是在所以它依賴的包的上層, 正如 圖11.2所示.
![](../images/ch11-02.png)
通過迴避循環導入依賴, 擴展測試包可以更靈活的測試, 特是集成測試(需要測試多個組件之間的交互), 可以像普通應用程序那樣自由地導入其他包.
通過迴避循環導入依賴, 擴展測試包可以更靈活的測試, 特是集成測試(需要測試多個組件之間的交互), 可以像普通應用程序那樣自由地導入其他包.
我們可以用 go list 工具査看包對應目録中哪些Go源文件是產品代碼, 哪些是包內測試, 還哪些測試擴展包. 我們以 fmt 包作一個例子. GoFiles 示產品代碼對應的Go源文件列; 也就是 go build 命令要編譯的部分:
我們可以用 go list 工具査看包對應目録中哪些Go源文件是產品代碼, 哪些是包內測試, 還哪些測試擴展包. 我們以 fmt 包作一個例子. GoFiles 示產品代碼對應的Go源文件列; 也就是 go build 命令要編譯的部分:
{% raw %}
@@ -25,7 +25,7 @@ $ go list -f={{.GoFiles}} fmt
{% endraw %}
TestGoFiles 示的是 fmt 包內部測試測試代碼, 以 _test.go 後綴文件名, 不過隻在測試時被構建:
TestGoFiles 示的是 fmt 包內部測試測試代碼, 以 _test.go 後綴文件名, 不過隻在測試時被構建:
{% raw %}
@@ -38,7 +38,7 @@ $ go list -f={{.TestGoFiles}} fmt
包的測試代碼通常都在這些文件中, 不過 fmt 包並非如此; 稍後我們再解釋 export_test.go 文件的作用.
XTestGoFiles 示的是屬於測試擴展包的測試代碼, 也就是 fmt_test 包, 因此它們必鬚先導入 fmt 包. 樣, 這些文件也隻是在測試時被構建運行:
XTestGoFiles 示的是屬於測試擴展包的測試代碼, 也就是 fmt_test 包, 因此它們必鬚先導入 fmt 包. 樣, 這些文件也隻是在測試時被構建運行:
{% raw %}
@@ -50,11 +50,11 @@ $ go list -f={{.XTestGoFiles}} fmt
{% endraw %}
有時候測試擴展包需要訪問被測試包內部的代碼, 例如在一個了避免循環導入而被獨立到外部測試擴展包的白盒測試. 在這種情況下, 我們可以通過一些技巧解決: 我們在包內的一個 _test.go 文件中導齣一個內部的實現給測試擴展包. 因這些代碼隻有在測試時纔需要, 因此一般放在 export_test.go 文件中.
有時候測試擴展包需要訪問被測試包內部的代碼, 例如在一個了避免循環導入而被獨立到外部測試擴展包的白盒測試. 在這種情況下, 我們可以通過一些技巧解決: 我們在包內的一個 _test.go 文件中導齣一個內部的實現給測試擴展包. 因這些代碼隻有在測試時纔需要, 因此一般放在 export_test.go 文件中.
例如, fmt 包的 fmt.Scanf 需要 unicode.IsSpace 函數提供的功能. 但是了避免太多的依賴, fmt 包並沒有導入包含鉅大格數據的 unicode 包; 相反fmt包有一個叫 isSpace 內部的簡易實現.
例如, fmt 包的 fmt.Scanf 需要 unicode.IsSpace 函數提供的功能. 但是了避免太多的依賴, fmt 包並沒有導入包含鉅大格數據的 unicode 包; 相反fmt包有一個叫 isSpace 內部的簡易實現.
了確保 fmt.isSpace 和 unicode.IsSpace 函數的行一緻, fmt 包謹慎地包含了一個測試. 是一個在測試擴展包內的測試, 因此是無法直接訪問到 isSpace 內部函數的, 因此 fmt 通過一個祕密齣口導齣了 isSpace 函數. export_test.go 文件就是專門用於測試擴展包的祕密齣口.
了確保 fmt.isSpace 和 unicode.IsSpace 函數的行一緻, fmt 包謹慎地包含了一個測試. 是一個在測試擴展包內的測試, 因此是無法直接訪問到 isSpace 內部函數的, 因此 fmt 通過一個祕密齣口導齣了 isSpace 函數. export_test.go 文件就是專門用於測試擴展包的祕密齣口.
```Go
package fmt