2012-08-30 5 views
8

Czy istnieje sposób pisania testów jednostkowych, aby można je było skompilować i uruchomić zarówno z Delphi, jak i Free Pascalem?Testy jednosto-źródłowe dla Free Pascala i Delphi

Istnieją różne schematy testów jednostkowych dla Delphi i Free Pascal, które powodują powielanie pracy dla programistów, którzy kierują swoje działania na oba kompilatory (na przykład programistów bibliotek i frameworków).

Może więc istnieje sposób, używając frameworku DUnit lub FPCUnit i dostroić kod źródłowy przypadku testowego (lub samej struktury), aby działał również z innym kompilatorem.

Więc zasadniczo pytanie brzmi:

  • których ramy (DUnit lub FPCUnit) może zostać skompilowany z obu kompilatorów (Delphi i Pascal Free) z jak najmniejszym modyfikacjami, jak to możliwe?

lub

  • jest tam trzeci ramy (Dzięki Arnaud dla wspomnieć TSynTest), który współpracuje z Delphi i FPC?
+0

Pytasz konkretnie o pisanie testów DUnit w FPC. To wyraźnie niemożliwe. Ale o to naprawdę chciałeś zapytać? A może chcesz napisać kod w ramce testów jednostkowych? Moja odpowiedź nabrała pytania w wartości nominalnej. Pozostałe odpowiedzi przybrały łagodniejszą interpretację. Który to jest? –

+0

@DavidHeffernan dziękuję za wskazanie tego, zmodyfikowałem pytanie i dodałem tagi testowania fpcunit/unit – mjn

+0

Dobrze, teraz mogę usunąć odpowiedź, która nie jest już dokładna. Pytanie o wiele lepsze teraz. –

Odpowiedz

6

Domyślnie ramy testów jednostkowych dla Free Pascal jest FPCUnit, ma taką samą konstrukcję jak DUnit ale różni się od niej w drobnych szczegółach. Możesz pisać typowe testy jednostkowe dla FPCUnit i DUnit, omijając różnice przez {$IFDEF FPC}. Właśnie przetestowałem FPCUnit, jest to framework użyteczny i blogged about it.

3

Właśnie bita próbkę, która działa zarówno w DUnit (Delphi) i FPCUnit (FreePascal odpowiednika najbliższego DUnit, że dzieje się już statek „w polu” w Lazarus 1.0, która zawiera FreePascal 2.6):

Trochę banalny IFDEF, a ty tam jesteś.

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

Jeśli pójdziesz dalej, znajdziesz inne różnice, np. 'TTestCase.CheckEquals' w DUnit to' TTestCase.AssertEquals' to FPCUnit. Potrzebujesz więcej {$ IFDEF}. – kludg

+1

Wybrałbym klasę wrapperów, aby nie musieć zaśmiecać całego mojego kodu przy pomocy ifdef ... –

+0

Dokładnie. Podklas TTestCase z FPCUnit, i zapisz jednostkę jako TestFramework. Może sprawić, by cokolwiek innego potrzebujesz od TestUtils i TestRegistry, po prostu działa. –

10

Zobacz to very nice blog article - tylko świeże mięso o testach FPCUnit.

Krótko mówiąc, o ile wiem, a jeśli compare to DUnit:

  • Większość Sprawdź *() metody zostały przemianowane Assert *();
  • Metody SetUp/TearDown są nazywane dla funkcji w obu ramach;
  • Niektóre inne opinie mogą się różnić.

Tak, myślę, że to może być łatwo pozwolić FPCUnit „naśladuje” DUNIT przez tworząc małe klasy otoki nad wdrażaniem FPCUnit, aby mieć takie same dokładnych metod niż z DUnit. Więc możesz mieć możliwość dzielenia kodu między dwoma celami, a nawet ponownego wykorzystania istniejących testów DUnit. Taką klasą otoki jest IMHO o wiele wygodniejsza niż przy użyciu innych zaleceń. Kompilacja warunkowa powoduje, że kod trudny do debugowania, gadatliwy, nadmiarowy i powinien być używany tylko w razie potrzeby.

Innym potencjalnym rozwiązaniem może być wykorzystanie innych ram testów. Nasz mały TSynTest classes jest lżejszy, ale obecnie konwertuję framework na FPC. Tak więc ten sam dokładny kod mógł być użyty w obu kompilatorach.Ma pewne funkcje (takie jak opcjonalne rejestrowanie z dokładnym profilowaniem i strace w pełnym stosie w przypadku awarii), których brakowałoby mi DUnit/FPCUnit. Nie ma GUI ani czarodzieja, ale szczerze mówiąc, jako programista wolę zwykły tekst, który mogę zawrzeć w mojej dokumentacji technicznego wydania, aby z łatwością potwierdzić, że nie wystąpiła regresja.

+1

W każdym razie, ['Serg wspomniał'] (http://stackoverflow.com/a/12209940/960757) jego dzisiejszy post na blogu ;-) +1 do obu ... – TLama

+0

Sugeruję, że twój program TSynTest działa nieobarcznie tryb. Kiedy przeprowadzam testy jednostkowe, uruchamiam tester w trybie tekstowym i oczekuję wyników takich jak "......." z jedną kropką na zdany test i jawnym wyjściem (innym niż kropka) tylko w przypadku błędów. Mniej hałasu jest lepsze. –

+0

'TSynTest' nie jest domyślnie rozwlekły: wyświetla jedną linię na przebieg metody testowej. Możesz także przekierować wyjście. Po włączeniu logowania masz dużo treści (kilka 100 MB). Oczywiście, jeśli masz tylko jedną lub dwie twierdzenia na temat metody, staną się one pełne. W rzeczywistości projekt testowy ma mieć mniejsze prywatne lub publiczne metody testowania, a następnie przegrupować testy w opublikowanych metodach, z jawnymi nazwami, gotowymi do wyświetlenia. Możesz więc mieć małą ziarnistość, ale nie oczekuj jednej metody testowej dla każdej testowanej klasy lub metody. Na przykład nasz mORMot działa blisko 10 000 000 testów. –