回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,20 +1,20 @@
### 11.2.4. 擴展測試
### 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更容易理解,但實際上它不能被其他任何包入。
过我们可以通过测试扩展包的方式解决循环依赖的问题也就是在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 %}
@@ -36,9 +36,9 @@ $ go list -f={{.TestGoFiles}} fmt
{% endraw %}
包的測試代碼通常都在些文件中,不fmt包非如此;稍後我們再解export_test.go文件的作用。
包的测试代码通常都在些文件中,不fmt包非如此;稍后我们再解export_test.go文件的作用。
XTestGoFiles表示的是屬於測試擴展包的測試代碼也就是fmt_test包因此它們必須先導入fmt包。同樣,這些文件也是在測試時被構建運行:
XTestGoFiles表示的是属于测试扩展包的测试代码也就是fmt_test包因此它们必须先导入fmt包。同样,这些文件也是在测试时被构建运行:
{% raw %}
@@ -49,11 +49,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
@@ -61,5 +61,5 @@ package fmt
var IsSpace = isSpace
```
這個測試文件併沒有定義測試代碼;它是通fmt.IsSpace簡單導出了部的isSpace函,提供給測試擴展包使用。這個技巧可以泛用於位於測試擴展包的白盒測試
这个测试文件并没有定义测试代码;它是通fmt.IsSpace简单导出了部的isSpace函,提给测试扩展包使用。这个技巧可以广泛用于位于测试扩展包的白盒测试