2008-09-16 47 views
8

我確信從this presentation和其他網站上的評論我需要學習單元測試。我也意識到,關於單元測試在這裏有很多問題。每次我考慮如何在我目前正在使用的應用程序中完成這些工作時,我都會走開,感到困惑。這是一個令人興奮的應用程序應用程序,許多邏輯都是基於事件的 - 當用戶點擊此處時,會發生此操作。一個單元如何測試程序或基於事件的代碼段

通常我看到的用於測試的示例是測試類 - 它們實例化對象,給它模擬數據,然後檢查對象的屬性。這對我有意義 - 但非面向對象的作品呢?

This guy mentioned在大多數任何測試框架中基於GUI的單元測試很困難,可能就是這個問題。上面鏈接的介紹中提到每次測試只能碰觸一個類,每次只涉及一個方法。這似乎排除了我想要做的事情。

所以這個問題 - 一個單元測試程序或基於事件的代碼如何?提供良好文檔的鏈接,或自己解釋。

另一方面,我還有一個挑戰,就是沒有找到一個測試xulrunner應用程序的測試框架 - 似乎這些工具還沒有開發出來。我認爲這比我理解概念,編寫可測試的代碼,應用單元測試更爲周邊。

回答

5

單元測試的想法是測試每個測試的小部分代碼。在基於事件的系統中,可以執行的一種單元測試形式是測試事件處理程序如何響應各種事件。因此,您的單元測試可能會將程序的一個方面設置爲特定狀態,然後直接調用事件偵聽器方法,最後測試程序的後續狀態。

如果你打算進行單元測試的基於事件的系統,你會讓你的生活輕鬆了許多爲自己,如果你使用依賴注入模式和理想會去的整套方法和使用控制反轉(見http://martinfowler.com/articles/injection.htmlhttp://msdn.microsoft.com/en-us/library/aa973811.aspx這些模式的詳細信息)

(感謝pc1oad1etter您指出我會搞砸的鏈接)

+0

你實際上鍊接到同一篇文章兩次 - 你的意思是? – pc1oad1etter 2008-09-16 14:58:16

+0

我認爲這兩個概念(DI和IoC)會超出我的想象。我不認爲我曾經在學校或任何工作中瞭解過設計模式。 – pc1oad1etter 2008-10-04 05:18:57

1

問題是「基於事件的編程」將太多的邏輯與事件聯繫起來。這樣的系統應該設計的方式是應該有一個引發事件的子系統(並且你可以編寫測試來確保這些事件按照正確的順序被引發)。而且還應該有另一個子系統,只處理管理一個表單的狀態。你可以編寫一個單元測試來驗證給定正確的輸入(即正在發生的事件),將把表單狀態設置爲正確的值。

除此之外,從組件1引發並調用組件2上的行爲的實際事件處理程序只是集成測試,可由質量保證人員手動完成。

2

起初我會測試這樣的活動:

private bool fired; 

private void HandlesEvent(object sender, EventArgs e) 
{ 
    fired = true; 
} 

public void Test() 
{ 
    class.FireEvent += HandlesEvent; 
    class.PErformEventFiringAction(null, null); 

    Assert.IsTrue(fired); 
} 

,然後我發現RhinoMocks。 RhinoMocks是一個創建模擬對象的框架,它也處理事件測試。它也可以用於您的程序測試。

0

我發現對程序代碼有幫助的方法是使用TextTest。這與單元測試沒有多大關係,但它可以幫助您進行自動化迴歸測試。這個想法是,你有你的應用程序寫一個日誌,然後使用texttest比較你的更改前後的日誌。

0

見經常聯Working Effectively with Legacy Code。請參閱標題爲「我的應用程序是所有API調用」和「我的項目不是面向對象的」部分,我如何進行安全更改?

在C/C++世界(我的經驗)中,實踐中最好的解決方案是使用鏈接器「seam」並鏈接到被測函數調用的所有函數的測試雙精度。這樣您就不會更改任何遺留代碼,但您仍然可以對其進行單獨測試。

2

在這裏回答我自己的問題,但我偶然發現了一篇文章,解釋了這個問題,並做了一個簡單示例的演練 - Agile User Interface Development。代碼和圖片都是偉大的,這裏是給出了這個概念的一個片段:

敏捷大師如Kent Beck和 大衛Astels建議通過保持視圖對象非常薄, 和測試大樓的GUI 層「在 表面下。」這種「智能對象/薄型 視圖」模型類似於熟悉的文檔視圖和 客戶端 - 服務器範例,但是將 應用於開發單獨的GUI 元素。內容分離 和演示文稿改進了代碼的設計 ,使其更加模塊化並且可測試。 用戶界面的每個組件都以 智能對象的形式實現,其中包含應測試 的應用程序行爲,但不包含GUI演示代碼。 每個智能對象都有一個相應的薄視圖類,其中僅包含 通用GUI行爲。使用這種設計 模型,GUI構建變得適合TDD的 。

1

你的問題沒有說明你選擇的編程語言,但我的是C#,所以我將用這個例子來說明。然而,這只是通過使用匿名代表內聯您的測試代碼來改進Gilligans的答案。我都支持讓測試儘可能可讀,對我來說,這意味着測試方法中的所有測試代碼;

// Arrange 
var car = new Car(); 
string changedPropertyName = ""; 
car.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e) 
         { 
          if (sender == car) 
            changedPropertyName = e.PropertyName; 
         }; 

// Act 
car.Model = "Volvo"; 

// Assert 
Assert.AreEqual("Model", changedPropertyName, 
    "The notification of a property change was not fired correctly."); 

我測試這裏的類實現INotifyPropertyChanged接口,因此只要屬性的值已經改變了NotifyPropertyChanged事件應該提高。

相關問題