簡體   English   中英

受保護的方法是否應該進行單元測試? 如何避免重復測試?

[英]Should protected methods be unit-tested? How to avoid repetitive testing?

使用C#

我知道這已經被問過了,很多人會回答“不”,只測試公共方法,而不是實現細節。 如果它有一些重要的邏輯,其他人會說是的。 盡管您可能隨后考慮將其分解為自己的類。

我尚未看到的一個問題是必須重復測試在繼承的類中調用受保護方法的公共方法。 如果我在基類中測試了受保護的方法,那么肯定不必在基類中重新測試它。 還是應該將測試復制並粘貼到多個類?

您絕對應該測試受保護的方法。 從測試的角度來看,即使“公共”僅限於從您的類派生的類,“受保護”方法仍是公共接口的一部分。 由於您無法控制的代碼可以引用這些方法,因此必須確保它們按定義運行。

至於重復測試,我沒有明確的答案。 如果給出:

public class A
{
    protected virtual void Foo() {}
}

public class B:A
{

}

問題是您是否為B.Foo編寫測試。 一方面,我會說不,因為B沒有提供Foo的顯式實現,因此它的行為與A.Foo的行為不可能不同,我們可以假設您已經測試過A.Foo

另一方面, A.Foo可能依賴於B可以修改的某些其他protected字段或屬性,或者取決於B在構造函數或初始化函數中提供的私有回調。 在那種情況下,您絕對必須測試B.Foo因為它的行為可能A.Foo不同,即使B不會覆蓋A.Foo

顯然,如果B覆蓋Foo ,那么您必須為B.Foo編寫測試。 但是,如果B沒有覆蓋A.Foo ,那么您必須使用您的判斷。

綜上所述,這與為任何派生自另一個類的代碼編寫測試沒有什么不同。 考慮從TextWriter派生一個類。 您是否會為TextWriter類定義的所有虛函數編寫顯式的單元測試? 還是只為覆蓋的那些方法以及其功能可能已經改變的那些方法編寫測試?

關於什么應該進行單元測試和什么不應該進行單元測試,存在很多意見。 我個人認為,對於您編寫的每個函數,都應該首先編寫一個單元測試以指定所需的行為。 然后,您編寫代碼以使此測試通過。 這適用於私人,公共,受保護的和內部的。 如果使用,則應進行單元測試。 相信我,從長遠來看,這會使您的生活變得更輕松,因為如果您或其他開發人員更改了現有的單元測試代碼,那么行為更改很有可能會被抓住。

盡管在現實世界中,通常通常首先要編寫代碼然后再進行測試。 但是,仍應針對所有訪問級別編寫它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM