2012-08-30 16 views
8

C'è un modo per scrivere test di unità in modo che possano essere compilati ed eseguiti sia con Delphi che con Free Pascal?Test di unità a sorgente singola per Free Pascal e Delphi

Esistono diversi framework di test unitari per Delphi e Free Pascal, che creano un lavoro duplicato per gli sviluppatori che hanno come target sia i compilatori (ad esempio, gli sviluppatori di librerie e framework).

Quindi forse c'è un modo, utilizzando il DUnit o il framework FPCUnit e modificare il codice sorgente del caso di test (o il framework stesso) in modo che funzioni anche con l'altro compilatore.

Quindi, in sostanza la domanda è:

  • cui quadro (dunit o FPCUnit) possono essere compilati con entrambi i compilatori (Delphi e Free Pascal) con il minor numero possibile di modifiche?

o

  • c'è un terzo quadro (Grazie a Arnaud per menzionare TSynTest) che funziona con Delphi e FPC?
+0

Si chiede specificamente di scrivere test DUnit in FPC. Questo è chiaramente impossibile. Ma è quello che volevi davvero chiedere? O vuoi semplicemente scrivere il codice in qualche framework di test unitario? La mia risposta ha preso la domanda al valore nominale. Le altre risposte hanno assunto un'interpretazione più indulgente. Cos'è questo? –

+0

@DavidHeffernan grazie per avermelo fatto notare, ho modificato la domanda e aggiunto i tag fpcunit/unit testing – mjn

+0

Bene, ora posso cancellare la risposta che non è più precisa. Domanda molto meglio ora. –

risposta

6

predefinito quadro unit test per Free Pascal è FPCUnit, ha lo stesso design dunit ma diverso da esso in dettagli minori. È possibile scrivere test unitari comuni per FPCUnit e DUnit eludendo le differenze per {$IFDEF FPC}. Ho appena testato FPCUnit, è un framework utilizzabile e blogged about it.

3

ho montata su un campione che funziona sia dunit (Delphi) e FPCUnit (equivalente Freepascal più vicina a dunit, che avviene per la spedizione già "nella casella" in Lazarus 1.0, che include FreePascal 2.6):

Un bit banale di IFDEF e ci sei.

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

Se andrai oltre, troverai altre differenze, come 'TTestCase.CheckEquals' in DUnit è' TTestCase.AssertEquals' è FPCUnit. Hai bisogno di più {$ IFDEF}. – kludg

+1

Vorrei andare a un corso di wrapper per evitare di dover sparpagliare tutto il mio codice con ifdef's ... –

+0

Esattamente. Sottoclasse TTestCase da FPCUnit e salva l'unità come TestFramework. Forse fare tutto il necessario da TestUtils e TestRegistry funziona. –

10

Vedere questo very nice blog article - solo carne fresca su test FPCUnit.

Insomma, per quanto ne so, e se si compare to DUnit:

  • maggior Controllo *() metodi sono stati rinominati Assert *();
  • I metodi SetUp/TearDown sono chiamati per funzione in entrambi i framework;
  • Alcuni altri possono variare.

Quindi, penso che potrebbe essere facile lasciare FPCUnit "imita" dunit, da creando una piccola classe wrapper sull'esecuzione FPCUnit, di avere gli stessi metodi esatti che con dunit. Quindi potresti essere in grado di condividere il codice tra i due obiettivi e persino riutilizzare i test DUnit esistenti. Una tale classe di wrapper è IMHO molto più comoda rispetto all'uso di {$ifdef FPC} come suggerito qui. La compilazione condizionale tende a rendere il codice difficile da eseguire il debug, dettagliato, ridondante e dovrebbe essere utilizzato solo se necessario.

Un'altra possibile soluzione potrebbe essere quella di utilizzare altri framework di test. Il nostro piccolo TSynTest classes è più leggero, ma attualmente sto convertendo il framework in FPC. Quindi lo stesso identico codice potrebbe essere usato con entrambi i compilatori.Ha alcune caratteristiche (come la registrazione facoltativa con profilazione fine e lo stack completo in caso di errore) che mi mancherebbero da DUnit/FPCUnit. Non ha una GUI o un Wizard ma onestamente, in quanto programmatore preferisco il semplice testo che posso includere nella documentazione di rilascio tecnico facilmente per testimoniare che non si è verificata alcuna regressione.

+1

In ogni caso, ['Serg menzionato'] (http://stackoverflow.com/a/12209940/960757) il post del suo blog di oggi ;-) +1 a entrambi ... – TLama

+0

Suggerisco che il tuo TSynTest in esecuzione abbia un non verboso modalità. Quando eseguo i test unitari, eseguo il test-runner in modalità testo e mi aspetto un output come questo '.......' con un punto per test superato e un output esplicito (diverso da un punto) solo per i guasti. Meno rumore è meglio. –

+0

'TSynTest' non è molto dettagliato per impostazione predefinita: visualizzerà una riga per l'esecuzione del metodo di prova. Puoi anche reindirizzare l'output. Quando si attiva la registrazione, si dispone di molto contenuto (diversi 100 MB). Naturalmente, se hai solo uno o due asserti per metodo, diventerà prolisso. In effetti, il progetto di test utilizzato prevede di avere metodi privati ​​o pubblici più piccoli da testare, quindi raggruppare i test all'interno dei metodi pubblicati, con nomi espliciti, pronti per essere visualizzati. Quindi puoi avere una granularità ridotta, ma non aspettarti un metodo di prova per classe o metodo testati. Ad esempio, il nostro mORMot si avvicina a 10.000.000 di test. –