回到简体

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,14 +1,14 @@
### 11.2.3. 白盒測試
### 11.2.3. 白盒测试
種測試分類的方法是基於測試者是否需要了解被測試對象的部工作原理。黑盒測試隻需要測試包公的文和API行爲,內部實現對測試代碼是透明的。相反,白盒測試有訪問包內部函數和數據結構的權限,因此可以做到一下普通客戶端無法實現的測試。例如,一白盒測試可以在每操作之後檢測不變量的數據類型。(白盒測試隻是一個傳統的名,其實稱爲clear box測試會更準確。)
种测试分类的方法是基于测试者是否需要了解被测试对象的部工作原理。黑盒测试只需要测试包公的文和API行为,内部实现对测试代码是透明的。相反,白盒测试有访问包内部函数和数据结构的权限,因此可以做到一下普通客户端无法实现的测试。例如,一白盒测试可以在每操作之后检测不变量的数据类型。(白盒测试只是一个传统的名,其实称为clear box测试会更准确。)
黑盒和白盒這兩種測試方法是互的。黑盒測試一般更健壯,隨着軟件實現的完善測試代碼很少需要更新。它可以幫助測試者了解是客的需求,也可以幫助發現API設計的一些不足之。相反,白盒測試則可以對內部一些棘手的實現提供更多的測試覆蓋
黑盒和白盒这两种测试方法是互的。黑盒测试一般更健壮,随着软件实现的完善测试代码很少需要更新。它可以帮助测试者了解是客的需求,也可以帮助发现API设计的一些不足之。相反,白盒测试则可以对内部一些棘手的实现提供更多的测试覆盖
們已經看到兩種測試的例子。TestIsPalindrome測試僅僅使用出的IsPalindrome函,因此是一黑盒測試。TestEcho測試則調用了部的echo函數,併且更新了部的out包級變量,這兩個都是未出的,因此是白盒測試
们已经看到两种测试的例子。TestIsPalindrome测试仅仅使用出的IsPalindrome函,因此是一黑盒测试。TestEcho测试则调用了部的echo函数,并且更新了部的out包级变量,这两个都是未出的,因此是白盒测试
當我們準備TestEcho測試的時候,我們脩改了echo函使用包的out量作爲輸出對象,因此測試代碼可以用另一個實現代替標準輸出,這樣可以方便比echo出的數據。使用似的技,我可以將産品代的其他部分也替換爲一個容易測試的僞對象。使用僞對象的好是我可以方便配置,容易預測,更可靠,也更容易察。同也可以避免一些不良的副作用,例如更新生産數據庫或信用卡消費行爲
当我们准备TestEcho测试的时候,我们修改了echo函使用包的out量作为输出对象,因此测试代码可以用另一个实现代替标准输出,这样可以方便比echo出的数据。使用似的技,我可以将产品代的其他部分也替换为一个容易测试的伪对象。使用伪对象的好是我可以方便配置,容易预测,更可靠,也更容易察。同也可以避免一些不良的副作用,例如更新生产数据库或信用卡消费行为
下面的代演示了爲用戶提供網絡存儲的web服中的配額檢測邏輯。當用戶使用了超90%的存儲配額之後將發送提醒件。
下面的代演示了为用户提供网络存储的web服中的配额检测逻辑。当用户使用了超90%的存储配额之后将发送提醒件。
<u><i>gopl.io/ch11/storage1</i></u>
```Go
@@ -48,7 +48,7 @@ func CheckQuota(username string) {
}
```
們想測試這個代碼,但是我們併不希望發送眞實的郵件。因此我們將郵件處理邏輯放到一私有的notifyUser函中。
们想测试这个代码,但是我们并不希望发送真实的邮件。因此我们将邮件处理逻辑放到一私有的notifyUser函中。
<u><i>gopl.io/ch11/storage2</i></u>
```Go
@@ -73,7 +73,7 @@ func CheckQuota(username string) {
}
```
在我可以在測試中用僞郵件發送函替代眞實的郵件發送函。它隻是簡單記録要通知的用戶和郵件的容。
在我可以在测试中用伪邮件发送函替代真实的邮件发送函。它只是简单记录要通知的用户和邮件的容。
```Go
package storage
@@ -107,7 +107,7 @@ func TestCheckQuotaNotifiesUser(t *testing.T) {
}
```
里有一個問題:當測試函數返迴後CheckQuota不能正常工作,因notifyUsers依然使用的是測試函數的僞發送郵件函數(當更新全局象的時候總會有這種風險)。 我們必須脩改測試代碼恢複notifyUsers原先的狀態以便後續其他的測試沒有影,要保所有的行路徑後都能恢,包括測試失敗或panic常的情形。在這種情況下我們建議使用defer語句來延後執行處理恢的代
里有一个问题:当测试函数返回后CheckQuota不能正常工作,因notifyUsers依然使用的是测试函数的伪发送邮件函数(当更新全局象的时候总会有这种风险)。 我们必须修改测试代码恢复notifyUsers原先的状态以便后续其他的测试没有影,要保所有的行路径后都能恢,包括测试失败或panic常的情形。在这种情况下我们建议使用defer语句来延后执行处理恢的代
```Go
func TestCheckQuotaNotifiesUser(t *testing.T) {
@@ -124,6 +124,6 @@ func TestCheckQuotaNotifiesUser(t *testing.T) {
}
```
這種處理模式可以用來暫時保存和恢所有的全局量,包括命令行標誌參數、調試選項和優化參數;安和移除致生産代碼産生一些調試信息的子函數;還有有些誘導生産代碼進入某些重要狀態的改,比如超時、錯誤,甚至是一些刻意造的併發行爲等因素。
这种处理模式可以用来暂时保存和恢所有的全局量,包括命令行标志参数、调试选项和优化参数;安和移除致生产代码产生一些调试信息的子函数;还有有些诱导生产代码进入某些重要状态的改,比如超时、错误,甚至是一些刻意造的并发行为等因素。
這種方式使用全局量是安全的,因go test命令併不會同時併發地執行多個測試
这种方式使用全局量是安全的,因go test命令并不会同时并发地执行多个测试