2010-08-04 18 views
1

我希望有人能夠幫助我看到這些測試的真正價值,因爲我閱讀了很多關於他們的知識,甚至在最近的項目中與他們一起工作。但我從來沒有真正看到測試中的真正價值。當然,我可以理解他們爲什麼寫這些東西,看看他們怎麼可能有用。但似乎這些類型的測試幾乎沒有投資回報率。這裏是我們的代碼庫的一些類的例子:不理解行爲測試的目的

void ServiceObject_SomeMethod_Uses_Dependency_SomePublicMethod() 
{ 
    create mock of IServiceObject; 
    stub out dependency object 
    add expectation of call to dependency.SomePublicMethod for IServiceObject.SomeMethod 

    call mockserviceobject.SomeMethod 

    check whether expectation was satisfied 
} 

顯然,有一些細節丟失,但如果:

class ServiceObject : IServiceObject 
{ 
    Dependency _dependency; 

    ServiceObject(Dependency dependency) 
    { 
     this._dependency = dependency 
    } 

    bool SomeMethod() 
    { 
     dependency.SomePublicMethod(); 
    } 
} 

然後在我們的行爲測試中,我們會寫測試,像這樣(僞代碼)你熟悉你會理解的這種類型的測試。

所以我的問題真的來自事實,我不知道如何知道我的ServiceObject調用到依賴方法是有價值的。我明白其背後的推理原因,因爲你想確保該方法的邏輯正在達到它應該達到的部分。但是我不明白的是,這是一個可持續的測試模式?

我寫了邏輯,知道代碼應該如何工作,爲什麼它會在我測試一次之後改變以確保它正常工作?現在你可以說,如果你在團隊環境中工作,你可能想要確保有人不會出現並更改代碼,以便意外跳過依賴關係,因此需要確保他們知道它。但是,如果因有正當理由而被跳過呢。那麼整個測試,也許其他任何人都將被廢棄。

無論如何,我只是希望有人能夠開啓這些類型的測試的真正潛力。

回答

0

目標是單獨測試類,真正單元測試它。確認它完全履行其職責。

在這種情況下,代碼是相當平凡的。當處理路徑中存在條件時,這種測試的價值可能會變得更加明顯,參數將傳遞給依賴項,並且處理將對依賴項的結果執行。

例如,假設代替的方法是這樣的:

bool someMethod(int paramX, int param Y){ 

    if ((paramX/paramY) > 5){ 
     return dependency.doOneThing(paramX); 
    } else { 
     return dependency.doSomethingElse(paramY); 
    } 

} 

現在我們有好幾個測試寫的,我覺得值變得更加明顯。特別是當我們寫paramY設置爲零的測試時。

+0

是的,我可以看到這一點。 – spinon 2010-08-05 00:14:41