2012-09-03 54 views
3

我有一些FastMM誤報的問題。這一次泄漏出現在測試表單中。這與我描述的here非常相似。德爾福7,FastMM和DUnit GUITesting虛假內存泄漏測試失敗

我得到了一個表單和一些普通的舊VCL控件。第一次測試顯示泄漏事實上並不存在。第二次運行沒有泄漏。我搜索了所有的DUnit源代碼,但找不到原因來解決它。有人能幫助我嗎?

我不能運行測試兩次,因爲:1.它將運行在一個持續集成;一些測試真的需要一些時間,加倍不是明智的。

我檢查的DUNIT GUI的最後3個選項: - 報告內存泄漏類型的Shutdown - 故障的TestCase如果內存泄露 - 忽略設置/ TearDown中

下面是範例代碼內存泄漏:

// form 
    type 

    TForm2 = class(TForm) 
     button1: TButton; 
    end; 

    implementation 

    {$R *.dfm} 

    // test 
    type 

    TTest = class(TGUITestCase) 
    private 
     a: TForm2; 
    public 
     procedure SetUp; override; 
     procedure TearDown; override; 
    published 
     procedure Test; 
    end; 

    implementation 

    procedure TTest.Setup; 
    begin 
     a := TForm2.Create(nil); 
    end; 

    procedure TTest.TearDown; 
    begin 
     FreeAndNil(a); 
    end; 

    procedure TTest.Test; 
    begin 
     a.Show; 
     a.close; 
    end; 
+1

試圖重現memleak與您的示例代碼,但與最新的dunit和fastmm(德爾福7)我發現沒有泄漏。 fastmm報告文件中包含什麼內容?還可以嘗試在Project選項下設置Map文件的詳細信息,包括TD32調試信息,並選中Use Debug Dcu-s來獲取詳細報告。 – balazs

+0

@balazs沒有生成報告。您能否指出您使用的DUnit和FastMM版本的鏈接?謝謝! –

+0

當然,[dunit](http://dunit.sourceforge.net/)的最後一個版本在寫這篇評論的時候是9.3,[fastmm4](http://sourceforge.net/projects/fastmm/),版本4.9.9.1。在FastMM4Options.inc開關FullDebugMode('{$ define FullDebugMode}')上,並將'FastMM_FullDebugMode.dll'複製到exe文件旁邊。 – balazs

回答

4

您將表單自由兩次。將操作設置爲caFree可使表單自動釋放。 因此,要麼刪除OnClose方法,要麼更好地在測試本身中創建窗體,並在不釋放窗體的情況下刪除設置和拆卸方法。 CaFree會照顧到這一點。

+0

I removed該行,並仍然給了我同樣的錯誤。 –

0

隨着下載版本ocacionaly的情況發生。看起來很荒謬,其根本原因是:如果我在加載DUnit GUI後過快地點擊「F9」,則會出現問題。等待幾秒鐘,沒有泄漏報道。

因爲我們在這裏覆蓋了FormShow事件來自動啓動測試,在我的情況下總是發生問題。所以,延遲執行2秒解決了我的問題。

感謝@balazs幫助我。