2012-08-30 54 views
8

有沒有寫單元測試的方法,以便可以使用Delphi和Free Pascal編譯和運行它們?Free Pascal和Delphi的單源單元測試

Delphi和Free Pascal有不同的單元測試框架,這會導致針對兩個編譯器(例如,庫和框架開發人員)的開發人員進行重複工作。

所以也許有一種方法,使用DUnit或FPCUnit框架,並調整測試用例源代碼(或框架本身),以便它也可以與其他編譯器一起使用。

所以基本上,問題是:

  • 該框架(DUNIT或FPCUnit)可以用兩種編譯器(Delphi和自由帕斯卡),用盡可能少的修改地編譯?

  • 有第三框架(感謝阿爾諾爲提TSynTest)與Delphi和FPC的作品?
+0

您特別要求在FPC中編寫DUnit測試。這顯然是不可能的。但那是你真正想問的問題嗎?或者你只是想在一些單元測試框架中編寫代碼?我的回答是以面值問題。其他答案的解釋更爲寬鬆。這是什麼? –

+0

@DavidHeffernan謝謝你指出這一點,我修改了這個問題,並添加了fpcunit/unit testing標籤 – mjn

+0

好,現在我可以刪除不再準確的答案。現在問題好多了。 –

回答

6

Free Pascal的默認單元測試框架是FPCUnit,它具有與DUnit相同的設計,但與小細節不同。通過規避{$IFDEF FPC}的差異,您可以爲FPCUnit和DUnit編寫通用單元測試。我剛剛測試了FPCUnit,它是一個可用的框架,並且blogged about it

3

我剛剛颳起,在這兩個DUNIT(DELPHI)和FPCUnit(最接近DUNIT,碰巧已經出貨「盒子」的拉撒路1.0,其中包括FreePascal的2.6 FreePascal的當量)的作品樣本:

IFDEF的一小部分,你在那裏。

unit TestUnit1; 

{$IFDEF FPC} 
{$mode objfpc}{$H+} 
{$ENDIF} 

interface 

uses 
    Classes, 
    {$ifdef FPC} 
    fpcunit, testutils, testregistry, 
    {$else} 
    TestFramework, 
    {$endif} 
    SysUtils; 

type 
    TTestCase1= class(TTestCase) 
    published 
    procedure TestHookUp; 
    end; 

implementation 

procedure TTestCase1.TestHookUp; 
begin 
    Self.Check(false,'value'); 
end; 

initialization 
    RegisterTest(TTestCase1{$ifndef FPC}.Suite{$endif}); 
end. 
+3

如果你會進一步發現其他的不同之處,比如DUnit中的'TTestCase.CheckEquals'是'TTestCase.AssertEquals'是FPCUnit。你需要更多{$ IFDEF}。 – kludg

+1

我想去一個包裝類,以避免亂拋垃圾所有我自己的代碼ifdef的... –

+0

沒錯。從FPCUnit中派生TTestCase子類,並將該單元保存爲TestFramework。也許只需要從TestUtils和TestRegistry中完成其他任何你需要的工作。 –

10

看到這個very nice blog article - 只是關於FPCUnit測試的新鮮肉類。

總之,據我所知,如果你compare to DUnit

  • 大多數檢查*()方法被改名爲斷言*();
  • 在這兩個框架中,SetUp/TearDown方法被稱爲per-function;
  • 其他一些認爲可能會有所不同。

所以,我認爲這可能是很容易讓FPCUnit「模仿」 DUNIT,由創建一個小包裝類超過FPCUnit實施,有比DUNIT完全相同的方法。因此,您可能能夠在兩個目標之間共享代碼,甚至可以重新使用現有的DUnit測試。這樣的包裝類是恕我直言,更方便使用{$ifdef FPC}其他建議在這裏。條件編譯往往會使代碼難以調試,冗長且冗餘,只有在必要時才應使用。

另一個可能的解決方案是使用其他測試框架。我們的小型TSynTest classes更輕,但我目前正在將該框架轉換爲FPC。因此,兩個編譯器都可以使用相同的確切代碼。它具有一些功能(比如可選的日誌記錄,精確的分析和全堆棧失敗),我會從DUnit/FPCUnit中錯過。它沒有一個GUI和一個嚮導,但是老實說,因爲我的程序員我更喜歡純文本,所以我可以很容易地將其包含在我的技術發佈文檔中,以證明沒有發生迴歸。

+1

無論如何,['Serg提及'](http://stackoverflow.com/a/12209940/960757)他的今天的博客文章;-) +1兩個... – TLama

+0

我建議您的TSynTest運行有一個非冗長的模式。當我運行單元測試時,我運行文本模式測試運行程序,並期望像這樣的'.......'輸出每個通過測試一個點,並顯式輸出(除了一個點)只用於失敗。噪音越小越好。 –

+0

'TSynTest'默認情況下不是很詳細:每個測試方法運行時會顯示一行。您也可以重定向輸出。啓用日誌記錄時,您擁有大量內容(幾百MB)。當然,如果每個方法只有一個或兩個斷言,它將變得冗長。實際上,所使用的測試設計是使用較小的私有或公共方法進行測試,然後在已發佈方法中重新組合測試,並使用明確的名稱進行顯示。所以你可以有很小的粒度,但是不要指望每個測試類或方法都有一個測試方法。例如,我們的mORMot運行接近10,000,000個測試。 –